java 数据库基本操作 V&KH{j/P
1、java数据库操作基本流程 N|q:wyS|
2、几个常用的重要技巧: =}7wpTc,
可滚动、更新的记录集 @N.W#<IG
批量更新 f7OfN#I
事务处理 Fw:s3ON9}
Y_PCL9G{p
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9>le-}~
1、取得数据库连接 'ESy>wA{y<
1)用DriverManager取数据库连接 )+w0NhJw
例子 r3ZY`zf
String className,url,uid,pwd; #eE:hiu<v
className = "oracle.jdbc.driver.OracleDriver"; u4o%qK
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #:Cr'U
uid = "system"; 0y'34}
pwd = "manager"; y>8!qVX
Class.forName(className); Iu0K#.s_
Connection cn = DriverManager.getConnection(url,uid,pwd); SVXey?A;CJ
2)用jndi(java的命名和目录服务)方式 x#dJH9NR[
例子 $K<jmEC@<
String jndi = "jdbc/db"; $yaE!.Kc
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); r~nrP=-%
DataSource ds = (DataSource) ctx.lookup(jndi); $.kIB+K
Connection cn = ds.getConnection(); T:cSv
@G
多用于jsp中 O0b8wpFf
2、执行sql语句 9>@_};l
1)用Statement来执行sql语句 lW&glU(
String sql; p fAp2"
Statement sm = cn.createStatement(); TaM,9MAu
sm.executeQuery(sql); // 执行数据查询语句(select) ]RnX'yw^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); */\dH<
2)用PreparedStatement来执行sql语句 ?\hXJih
String sql; B5B'H3@
sql = "insert into user (id,name) values (?,?)"; &;9<a^td
PreparedStatement ps = cn.prepareStatement(sql); w/G5I )G
ps.setInt(1,xxx); s'\"%~nF<
ps.setString(2,xxx); F$F5N1<
... [Z
Ea3/
ResultSet rs = ps.executeQuery(); // 查询 Bb:jy!jq_
int c = ps.executeUpdate(); // 更新 *N'B(j/
j-
F=5)A
3、处理执行结果 $BH0W{S
查询语句,返回记录集ResultSet 0?,EteR
更新语句,返回数字,表示该更新影响的记录数 .M:,pw"S]
ResultSet的方法 *o"F.H{#N
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "
I`YJEv
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 _Zf1=&U#/
8Yq6I>@!
4、释放连接 '{( n1es
cn.close(); !c1
E
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 8agd{bxU
AW> P\>{RE
可滚动、更新的记录集 NV9= ~cx
1、创建可滚动、更新的Statement Hg(\EEe
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]iLfe&f
该Statement取得的ResultSet就是可滚动的 Gq-U}r
2、创建PreparedStatement时指定参数 t4s}w$4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); C?x
ResultSet.absolute(9000); (nda!^f_s
批量更新 jIdhmd* $z
1、Statement ,PN>,hFL
Statement sm = cn.createStatement(); Kq!n`@
sm.addBatch(sql1); W97Ka}Y
sm.addBatch(sql2); nsgNIE{>gO
... Vp5qul%
sm.executeBatch() I8^z\ef&
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 j-{WPJa4\
2、PreparedStatement T/S-}|fhQ
PreparedStatement ps = cn.preparedStatement(sql); ,u]kZ ]
{ fvNGGn!
ps.setXXX(1,xxx); m@HU;J\I
... XTW/3pB
ps.addBatch(); }3[ [ONA
} bJ. ((1$
ps.executeBatch(); a.8 nWs^
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 cW&OVNj
Za}91z"
事务的处理 ITbl%q
1、关闭Connection的自动提交 k,v.U8
cn.setAutoCommit(false); p3x(:=
2、执行一系列sql语句 ?6j@EJ<2q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $g|g}>Sc
Statement sm ; 1YnDho;~
sm = cn.createStatement(insert into user...); IHagRldG
sm.executeUpdate(); W=)}=^N0
sm.close(); m5d;lrk@&/
sm = cn.createStatement("insert into corp...); tO~H/0
sm.executeUpdate(); M6?Q w=
sm.close(); SxT:k,ji
3、提交 Wdy2;a<\{
cn.commit(); ;utjW1y
4、如果发生异常,那么回滚 (\R"v^
cn.rollback();