java 数据库基本操作 8@/]ki`>
1、java数据库操作基本流程 '&3Sl?E
2、几个常用的重要技巧: yaA9*k
可滚动、更新的记录集 5in6Y5c kj
批量更新 wLU w'Ai
事务处理 $;+B)#
q[b-vTzI
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 slHlfWHq
1、取得数据库连接 5\f*xY
1)用DriverManager取数据库连接 T{|'<KT
例子 P,~a'_w:|D
String className,url,uid,pwd; OR( )D~:n
className = "oracle.jdbc.driver.OracleDriver"; }<&g1x'pa
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; r[M]2h
uid = "system"; _?@>S 7-
pwd = "manager"; &.o}(e:]
Class.forName(className); ~@bCSOIy
Connection cn = DriverManager.getConnection(url,uid,pwd); 6yTL7@V|B
2)用jndi(java的命名和目录服务)方式 CQ"IL;y
例子 GwwxSB&y
String jndi = "jdbc/db"; R8\y|p#c
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _e8@y{/~Fd
DataSource ds = (DataSource) ctx.lookup(jndi); ?YgK]IxD
Connection cn = ds.getConnection(); ^$_ifkkLz
多用于jsp中 +]CKu$,8
2、执行sql语句 T[<llh'+
1)用Statement来执行sql语句 bR*T}w$<
String sql; $z{HNY*2
Statement sm = cn.createStatement(); QD<^VY6
sm.executeQuery(sql); // 执行数据查询语句(select) !V@Y \M
d
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); v<tH 3I+
2)用PreparedStatement来执行sql语句 Iu(T@",Q#
String sql; N!"GwH
sql = "insert into user (id,name) values (?,?)"; KL.{)bi
PreparedStatement ps = cn.prepareStatement(sql); 0tn5>Dsk
ps.setInt(1,xxx); +tkd($//
ps.setString(2,xxx); m3 (fr
... .K}u`v T
ResultSet rs = ps.executeQuery(); // 查询 2v`VtV|B
int c = ps.executeUpdate(); // 更新 V uJth
zG@9-s* L
3、处理执行结果 Ps<)?q6(
查询语句,返回记录集ResultSet {)ZbOq2
更新语句,返回数字,表示该更新影响的记录数 Zu\#;O
ResultSet的方法 x7Ly,
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zmf5!77
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 A>OL5TCl
w*#k&N[X
4、释放连接 WqY:XE+?\
cn.close(); ;csAhkf:S
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <s+=v!
w69`vK
可滚动、更新的记录集 A~I}[O~(pb
1、创建可滚动、更新的Statement Ej 'a
G
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1oj7R7
该Statement取得的ResultSet就是可滚动的 WU#bA|Cf
2、创建PreparedStatement时指定参数 (rZq0*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); L\ _8}\
ResultSet.absolute(9000); +#1WOQfAD
批量更新 $./JA)`
1、Statement SP
HeI@i
Statement sm = cn.createStatement(); 0gO2^m)W
sm.addBatch(sql1); kZ`60X%wE
sm.addBatch(sql2); |KU>+4=
@
... }[D~#Z!k
sm.executeBatch() TDtk'=;
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 z ;y22
2、PreparedStatement MZ+8wr/y
PreparedStatement ps = cn.preparedStatement(sql); Gk799SDL
{ t
~U&a9&Z
ps.setXXX(1,xxx); ?)4|WN|c_
... "Oh-`C
ps.addBatch(); $CL=M
} wOHK
dQ'
ps.executeBatch(); wc~a}0uz
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 I.y|AQB
faD(,H
事务的处理 nsw.\(#
1、关闭Connection的自动提交 79:x>i=
cn.setAutoCommit(false); JZu7Fb]L9
2、执行一系列sql语句 &ks>.l\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close a_QO)
Statement sm ; w|?Nq?KA
sm = cn.createStatement(insert into user...); NqhRJa63
sm.executeUpdate(); R\0]\JEc
sm.close(); 1ZhJ?PI,9{
sm = cn.createStatement("insert into corp...); :$/lGIz
sm.executeUpdate(); A{5k}
sm.close(); Ha)w*1&w"
3、提交 |;rjr_I
cn.commit(); /kx:BoV
4、如果发生异常,那么回滚 i7e{REBXb
cn.rollback();