java 数据库基本操作 2#yDVN$
1、java数据库操作基本流程 LcA7f'GVK
2、几个常用的重要技巧: V8WSJ=-&
可滚动、更新的记录集 tKuJ &I~
批量更新 l+&DBw[
事务处理 iT|7**+3
}.8yKj^p
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 f>Ua 7!b
1、取得数据库连接 iyR"O1]
1)用DriverManager取数据库连接 :eL[nyQr
例子 +!ljq~%
String className,url,uid,pwd; tcl9:2/^]
className = "oracle.jdbc.driver.OracleDriver"; 8BZ&-j{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ja&S_'P[
uid = "system"; hW!n"qU
pwd = "manager"; noz1W ]
Class.forName(className); 5wAKA`p"z
Connection cn = DriverManager.getConnection(url,uid,pwd); =<PEvIn
2)用jndi(java的命名和目录服务)方式 9(!AKKrr;
例子 `jOk6;Z[
String jndi = "jdbc/db"; FVL{KNW~i
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +hispU3ia
DataSource ds = (DataSource) ctx.lookup(jndi); O
x`K7$)
Connection cn = ds.getConnection(); umnQ$y
0
多用于jsp中 QT!>izgcU
2、执行sql语句 NMhpKno
1)用Statement来执行sql语句 Svo\+S
String sql; YjL'GmL<
Statement sm = cn.createStatement(); +%klS `_
sm.executeQuery(sql); // 执行数据查询语句(select) Tjv'S
<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); <z#Fj`2{
2)用PreparedStatement来执行sql语句 k #\j \t-
String sql; iV#A-9
sql = "insert into user (id,name) values (?,?)"; ;34p
[RT
PreparedStatement ps = cn.prepareStatement(sql); zv/dj04>
ps.setInt(1,xxx); j6k"%QHf
ps.setString(2,xxx); f2M*]{N
... S|@/"?DC
ResultSet rs = ps.executeQuery(); // 查询 W4k$m2
int c = ps.executeUpdate(); // 更新 id8QagJ
n=$ne2/
3、处理执行结果 LCj3{>{/=
查询语句,返回记录集ResultSet yVGf[~X
更新语句,返回数字,表示该更新影响的记录数 3pW4Ul@e
ResultSet的方法 !||Gfia
1、next(),将游标往后移动一行,如果成功返回true;否则返回false UmGKj9u
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ='qVwM['
o37oR v]
4、释放连接 |xg#Q`O
cn.close(); 4<E <sD
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection -Hw3rv3o
.b<W*4{j0H
可滚动、更新的记录集 BaIuOZ@,
1、创建可滚动、更新的Statement &hL2xx=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]e"!ZR?XJ
该Statement取得的ResultSet就是可滚动的 5=#d#dDc
2、创建PreparedStatement时指定参数 7
wEv`5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); m||9,z-
ResultSet.absolute(9000); TKAs@X,t
批量更新 , u%V%
1、Statement 8c9<kGm$E
Statement sm = cn.createStatement(); VEIct{
sm.addBatch(sql1); aTeW#:m
sm.addBatch(sql2); <`; {gX1
... +0Q +0:
sm.executeBatch() <BZC5b6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $^?VyHXvY
2、PreparedStatement r`EjD}2d
PreparedStatement ps = cn.preparedStatement(sql); N#e9w3Rli
{ lfC]!=2%~8
ps.setXXX(1,xxx); n9J{f"`m
... U2W Hs3
ps.addBatch(); H6jt[
} EleJ$ `/
ps.executeBatch(); q6nRk~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 P\6:euI
W,CAg7:*
事务的处理 [Eu)~J*
1、关闭Connection的自动提交 LK}FI*A_
cn.setAutoCommit(false); 6XU p$Pd(
2、执行一系列sql语句 s>L.V2!$0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .f-=gZ* *
Statement sm ; /Qr`au
sm = cn.createStatement(insert into user...); 5.&)hmpg
sm.executeUpdate(); Vym0|cW
sm.close(); ~AX~z)
sm = cn.createStatement("insert into corp...); =QtFJ9\
sm.executeUpdate(); 3eJ\aVI>pE
sm.close(); L-j/R1fTvl
3、提交 }tu4z+T2
cn.commit(); =?^-P{:\?
4、如果发生异常,那么回滚 6R L~iD;X
cn.rollback();