java 数据库基本操作 {I4%
1、java数据库操作基本流程 xLA~1ZSVJw
2、几个常用的重要技巧: mbF(tSy
可滚动、更新的记录集 rei
8LW
批量更新 dX_!0E[c
事务处理 L<bYRGz
x|.v{tQa
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 mfZ)^X
1、取得数据库连接 ]kRI}Om2
1)用DriverManager取数据库连接 8$\Za,)g
例子 6tOCZ'f
String className,url,uid,pwd; Dq?E\
className = "oracle.jdbc.driver.OracleDriver"; fZ[kh{|
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; y&1%1 #8F
uid = "system"; uCw>}3
pwd = "manager"; RG&I\DTyt
Class.forName(className); }-d)ms!
Connection cn = DriverManager.getConnection(url,uid,pwd); EbCIIMbe"
2)用jndi(java的命名和目录服务)方式 K'x4l,rq
例子 `q%U{IR
String jndi = "jdbc/db"; y|^EGnaE
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8s<^]sFP
DataSource ds = (DataSource) ctx.lookup(jndi); Ks#A<! ;=
Connection cn = ds.getConnection(); zm3-C%:Bw
多用于jsp中 /$;,F't#2M
2、执行sql语句 #S%4?
1)用Statement来执行sql语句 X` ATH^S
String sql; uaiz*Im
Statement sm = cn.createStatement(); <x0)7xX
sm.executeQuery(sql); // 执行数据查询语句(select) tE[H8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4avc=Y5
2)用PreparedStatement来执行sql语句 :-)GNf yGz
String sql; `AR"!X
sql = "insert into user (id,name) values (?,?)"; I6+2>CUGo
PreparedStatement ps = cn.prepareStatement(sql); im8
-7Xt
ps.setInt(1,xxx); }7.#Dj/r6
ps.setString(2,xxx); C)OG62
... J7:9_/e0T
ResultSet rs = ps.executeQuery(); // 查询 b \:~ ;
int c = ps.executeUpdate(); // 更新 ZP-dW|<[x
!K[/L<
Kv
3、处理执行结果 |8bE9qt.P
查询语句,返回记录集ResultSet lK*jhW?3:
更新语句,返回数字,表示该更新影响的记录数 fmFzW*,E
ResultSet的方法 S.: 7k9
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6JSY56v
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 P'sfi>A
s
D_G)c
4、释放连接 b4CF`BG
cn.close(); RAV^D.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection '@bJlJB9>
'99@=3AB:`
可滚动、更新的记录集 GzdRG^vN
1、创建可滚动、更新的Statement L?8^aG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); j9:/RJS
该Statement取得的ResultSet就是可滚动的 qbb6,DL7J
2、创建PreparedStatement时指定参数 34z+INkX
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :N2E}hxk
ResultSet.absolute(9000); )|pU.K9qZ
批量更新 JdiP>KXV
1、Statement Yrxk Kw#
Statement sm = cn.createStatement(); LKx` v90p
sm.addBatch(sql1); G=|70pxU
sm.addBatch(sql2); :k~dj C
...
:=9<
sm.executeBatch() tw<P)V\h
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0oSQY[ht/
2、PreparedStatement p>q&&;fe
PreparedStatement ps = cn.preparedStatement(sql); 7(C x!Yb
{ GF'f[F6oI
ps.setXXX(1,xxx); ? Vp%=E
... )Q]w6he3
ps.addBatch(); [(ygisqt
} H-,TS^W
ps.executeBatch(); BxdX WO
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 h=6xZuA\
<B)
事务的处理 Ux}W&K/?'
1、关闭Connection的自动提交 =We2^W-{
cn.setAutoCommit(false); @}DFp`~5|
2、执行一系列sql语句 +AoP{x$Ia
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close PNpu*#Z`
Statement sm ; O9^T3~x[V
sm = cn.createStatement(insert into user...); Qdu$Os
sm.executeUpdate(); u1^\MVO8
sm.close(); ]JdJe6`Mc
sm = cn.createStatement("insert into corp...); ,?(ciO)
sm.executeUpdate(); `\N]wlB2/b
sm.close(); Jf_%<\ O
3、提交 <bUXC@3W
cn.commit(); @?Zf-.
4、如果发生异常,那么回滚 @h}`DNaZ^
cn.rollback();