java 数据库基本操作 @T<ad7g-2J
1、java数据库操作基本流程 opm?':Qst
2、几个常用的重要技巧: 4t&gW
可滚动、更新的记录集 >EBZ$ X
批量更新 0n4g$JK7
事务处理 x`]Ofr'
+<pVf%u5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 nGq]$h
1、取得数据库连接 Ef2Yl
1)用DriverManager取数据库连接 y]yine
例子 {V}t'x`4c
String className,url,uid,pwd; y=[gQJ6~r
className = "oracle.jdbc.driver.OracleDriver"; lq:]`l,6@
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; TRF]i/Bs
uid = "system"; ooTc/QEYi
pwd = "manager"; #,@bxsB
Class.forName(className); tlDYk
Connection cn = DriverManager.getConnection(url,uid,pwd); 6yE'/VB<
2)用jndi(java的命名和目录服务)方式 ;$vLq&(}
例子 }czsa_
String jndi = "jdbc/db"; L/H v4={
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); "/Y<G
DataSource ds = (DataSource) ctx.lookup(jndi); "Z;~Y=hC13
Connection cn = ds.getConnection();
z'7#"D
多用于jsp中 <KKDu$W|T
2、执行sql语句 MQwIPjk8
1)用Statement来执行sql语句 vTpStoUM
String sql; D,c!#(v cK
Statement sm = cn.createStatement(); JT4wb]kdV
sm.executeQuery(sql); // 执行数据查询语句(select) SXQ@;=]xV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5,S,\O9>X
2)用PreparedStatement来执行sql语句 r)gCTV(kb
String sql; hdo&\Q2D8
sql = "insert into user (id,name) values (?,?)"; ^`tk/#h\9F
PreparedStatement ps = cn.prepareStatement(sql); >eQbipn
ps.setInt(1,xxx); z<a$q3!#
ps.setString(2,xxx); I`22Zwq:
... T36x=LX
ResultSet rs = ps.executeQuery(); // 查询 yC
W*fIaq
int c = ps.executeUpdate(); // 更新 ITVQLQ
z(+&wa
3、处理执行结果 T_eJ}(p
查询语句,返回记录集ResultSet VLiIO"u;
更新语句,返回数字,表示该更新影响的记录数 zm3-C%:Bw
ResultSet的方法 /$;,F't#2M
1、next(),将游标往后移动一行,如果成功返回true;否则返回false w "{bp
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &B}Lo
E_~x==cb
4、释放连接 Yg/}ghF\
cn.close(); q7|:^#{av
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection J5;5-:N
xZX`%f-
可滚动、更新的记录集 s8^~NX(xdy
1、创建可滚动、更新的Statement 88
{1mA,v
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); fO6[!M(
该Statement取得的ResultSet就是可滚动的 Nu@5 kwH
2、创建PreparedStatement时指定参数 G%S6$@:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /?Vdqci
ResultSet.absolute(9000); bMsECA&
批量更新 8q0I:SJy
1、Statement ~F;CE"3A
Statement sm = cn.createStatement(); ?KCivf
sm.addBatch(sql1); =ai2z2z
sm.addBatch(sql2); N&"QKd l
... W@^J6sH
sm.executeBatch() O16r!6=-n
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 >:2}V]/;
2、PreparedStatement $0#6"urG
PreparedStatement ps = cn.preparedStatement(sql); h}h^L+4
{ s
D_G)c
ps.setXXX(1,xxx); b4CF`BG
... I FsE!oDs4
ps.addBatch();
r@k"4ce-
} #,&8&
ps.executeBatch(); _wz2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 -^Xy%
UgC)7
K1
事务的处理 .Rvf/-e
1、关闭Connection的自动提交 }S */b1
cn.setAutoCommit(false); c_#*mA"+
2、执行一系列sql语句 Rv<L#!;
t
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^2EhlK^)
Statement sm ; }z
wX
sm = cn.createStatement(insert into user...); ?W!ry7gXO
sm.executeUpdate(); _42Z={pZZq
sm.close(); F}D3,&9N
sm = cn.createStatement("insert into corp...); .#0H{mk
sm.executeUpdate(); 'd/*BjNp)
sm.close(); tw<P)V\h
3、提交 /g@^H/DO
cn.commit(); Wwhgo.Wx
4、如果发生异常,那么回滚 G6V/S aD
cn.rollback();