java 数据库基本操作 f`_6X~
p
1、java数据库操作基本流程 $
iU~p
2、几个常用的重要技巧: }7/Ob)O
可滚动、更新的记录集 *Y- rEF >
批量更新 j:'!P<#
事务处理 r2>y
!Q?
\DRYqLT`
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 F`
]s
1、取得数据库连接 Xc7Qu?}
1)用DriverManager取数据库连接 p|R]/C0f
例子 Rj{D#5
String className,url,uid,pwd; >)S'`e4Gu
className = "oracle.jdbc.driver.OracleDriver"; ?&r>`H E
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; vA,tW,
uid = "system"; "AMsBvzgo
pwd = "manager"; bL18G(5
Class.forName(className); &?B\(?*
Connection cn = DriverManager.getConnection(url,uid,pwd); R3} Z"
2)用jndi(java的命名和目录服务)方式 T|lyjX$Q]9
例子 zd#/zUPI
String jndi = "jdbc/db"; hOF>Dj
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Y%]&h#F
DataSource ds = (DataSource) ctx.lookup(jndi); Cr%6c3aQ
Connection cn = ds.getConnection(); Nyo,6 AA
多用于jsp中 &1,qC,:!
2、执行sql语句 AJ-~F>gn
1)用Statement来执行sql语句 <D{_q.`vA
String sql; +G>;NiP_
Statement sm = cn.createStatement(); Gzu $
sm.executeQuery(sql); // 执行数据查询语句(select) KoO\<_@";
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 3?oj46gP
2)用PreparedStatement来执行sql语句 XW9
[VUW~
String sql; y5bELWA
sql = "insert into user (id,name) values (?,?)"; jYJfo<
PreparedStatement ps = cn.prepareStatement(sql); $)Pmr1==
ps.setInt(1,xxx); *`.4M)Ym~
ps.setString(2,xxx); LjA>H>8%[
... h; sdm/
ResultSet rs = ps.executeQuery(); // 查询 7q,M2v;
int c = ps.executeUpdate(); // 更新 ~`x<;Ts
t=oTU,<
3、处理执行结果 gEQevy`T%c
查询语句,返回记录集ResultSet B$cx
'_zF
更新语句,返回数字,表示该更新影响的记录数 sy.U]QG
ResultSet的方法 wXxk+DV@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~",,&>#[K
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )t$|'c}
.]W A/}
4、释放连接 Uw5`zl
cn.close(); ^YG.eT6iG
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 1]j_4M14aA
&`4v,l^Zi6
可滚动、更新的记录集 k,nRC~Irh
1、创建可滚动、更新的Statement 1u0NG)*f
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,zY!EHpx
该Statement取得的ResultSet就是可滚动的 u6(>?r-
2、创建PreparedStatement时指定参数 &MsBcP[
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); SZQ4e
ResultSet.absolute(9000); a7UfRG
批量更新 )q+9_KUq
1、Statement O<v9i4*
Statement sm = cn.createStatement(); SRx `m,535
sm.addBatch(sql1); 3xnu SOdh
sm.addBatch(sql2); mf)o1O&B
... (j;6}@
sm.executeBatch() sS|N.2*
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 \aG:l.IM0
2、PreparedStatement @}cZxFQ!C
PreparedStatement ps = cn.preparedStatement(sql); `Dco!ih
{ kf<5`8
ps.setXXX(1,xxx); *FT )`
... bqDHLoB\1
ps.addBatch(); Hc{0O7
} tgbr/eCoU
ps.executeBatch(); ]h$,=Qf
hD
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 '
Z}/3 dp
Dj9).lgc
事务的处理 q={\|j$X
1、关闭Connection的自动提交 ]}&f<X
cn.setAutoCommit(false); T=QV =21qn
2、执行一系列sql语句 =pP0dvn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /)` kYD6
Statement sm ; @gZ<!g/vza
sm = cn.createStatement(insert into user...); CS*wvn;.
sm.executeUpdate(); p}'uCT
ga
sm.close(); Jh'\ nDz@e
sm = cn.createStatement("insert into corp...); f}cz_"o4
sm.executeUpdate(); 0-W{(xy@4
sm.close(); $}/ !mXI5
3、提交 bLysUj5[5
cn.commit(); S:En9E
4、如果发生异常,那么回滚 BEzF'<Z
cn.rollback();