java 数据库基本操作 fRfn2jA)d
1、java数据库操作基本流程 l?iSxqdT
2、几个常用的重要技巧: \@>b;4Fb+N
可滚动、更新的记录集 87WBM;$&s
批量更新 (n1Bh~R^
事务处理 =0-
$W5E
U;n*j3wT
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 r|*&GHo L
1、取得数据库连接 ql GW.jY.
1)用DriverManager取数据库连接 jAh2N3)
例子 1.D-FPK
String className,url,uid,pwd; CdUAy|!`R
className = "oracle.jdbc.driver.OracleDriver"; N-g8}03
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ?DH"V7bs
uid = "system"; '&99?s`u
pwd = "manager"; xcJ`1*1N
Class.forName(className); QW_agm
Connection cn = DriverManager.getConnection(url,uid,pwd); kSc{^-<R
2)用jndi(java的命名和目录服务)方式 [Px'\nVf
例子 2S8P}$mM
String jndi = "jdbc/db"; O,<IGO
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); O'GG Ti]e
DataSource ds = (DataSource) ctx.lookup(jndi); vfB2XVc
Connection cn = ds.getConnection(); KvQ,;A
多用于jsp中 +x]9+D&
2、执行sql语句 azP+GM=i7
1)用Statement来执行sql语句 >23-
String sql; /j"sS2$U
Statement sm = cn.createStatement(); ^>?CMcN4*
sm.executeQuery(sql); // 执行数据查询语句(select) AkU<g
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?%O3Oi Xz
2)用PreparedStatement来执行sql语句 9e U[*S
String sql; _al|'obomy
sql = "insert into user (id,name) values (?,?)"; L'i-fM[#
PreparedStatement ps = cn.prepareStatement(sql); pr,p=4m{\
ps.setInt(1,xxx); )s9',4$eK<
ps.setString(2,xxx); $DBGLmw
... @FN*TJ
ResultSet rs = ps.executeQuery(); // 查询 `O^G5 0
int c = ps.executeUpdate(); // 更新 =op%8NJf
WS2osBc
3、处理执行结果 ^Cv^yTj;&
查询语句,返回记录集ResultSet ]l~Vi_c
更新语句,返回数字,表示该更新影响的记录数 !TAp+b
ResultSet的方法 as+GbstN
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $3X-rjQtW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 O|cu.u|
,&HR(jTo
4、释放连接 OOBhbpg!D
cn.close(); Zc"B0_&?:7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q/I)V2a1i
nH !3(X*
可滚动、更新的记录集 }]UB;id'
1、创建可滚动、更新的Statement :
t$l.+B
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); U"f??y%)
该Statement取得的ResultSet就是可滚动的 fQnwy!-\
2、创建PreparedStatement时指定参数 mqfO4"lt
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); c~<1':
ResultSet.absolute(9000); $[@0^IJq=K
批量更新 hIJ)MZU|
1、Statement ~^)^q8
Statement sm = cn.createStatement(); `A/j1UWJ
sm.addBatch(sql1); 0(8H;T
sm.addBatch(sql2); w>xV
... ]+DI.%
sm.executeBatch() .w6eJ4]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4*Z6}"
2、PreparedStatement uqyB5V0gh
PreparedStatement ps = cn.preparedStatement(sql); "k$JP
{ d h^^G^
ps.setXXX(1,xxx); iO1nwl !#
... aH_6s4+:
ps.addBatch(); hbOnlj4
} rAdacnZV
ps.executeBatch(); I-NN29Sk
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _ia! mT<
n
uQM^2
事务的处理 :Zw@yt
1、关闭Connection的自动提交 !SHj$Jwa'
cn.setAutoCommit(false); 7@%'wy&A
2、执行一系列sql语句
Aw!gSf)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^]p
Statement sm ; 7yI@"c#O
sm = cn.createStatement(insert into user...); Wx)K*9
sm.executeUpdate(); 4YU/uQm
sm.close(); _DPOyR2
sm = cn.createStatement("insert into corp...); PWgDFL?
sm.executeUpdate(); smAC,-6]~
sm.close(); ^a9 oKI9n
3、提交 TB
aVW
cn.commit(); J?:[$ C5
4、如果发生异常,那么回滚 |f2A89
cn.rollback();