java 数据库基本操作 'nx";[6(
1、java数据库操作基本流程 j Z6]G{
2、几个常用的重要技巧: B)L=)N
可滚动、更新的记录集 &gv{LJd5b
批量更新 E\_Wpk
事务处理 Q:v9C ^7
wO-](3A-8P
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {p90
1、取得数据库连接 *X%dg$VcV
1)用DriverManager取数据库连接 bjq+x:>
例子 _x'?igy
String className,url,uid,pwd; U@'F9UB`
className = "oracle.jdbc.driver.OracleDriver"; HxE`"/~.7k
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; i!nPiac
uid = "system"; Le?yzf
pwd = "manager"; +t8{aaV
Class.forName(className); pBR9)T\n
Connection cn = DriverManager.getConnection(url,uid,pwd); Lh_Q@>k
2)用jndi(java的命名和目录服务)方式 C@P4}X0,=
例子 VX'cFqrK3
String jndi = "jdbc/db"; NA/hs/ '
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ;$FpxurX
DataSource ds = (DataSource) ctx.lookup(jndi); hQFF%xl
Connection cn = ds.getConnection(); ?|$IZ9
多用于jsp中 `i"7; _HoV
2、执行sql语句 n){F
FM
1)用Statement来执行sql语句 f3E%0cg
String sql; VV%Q "0\
Statement sm = cn.createStatement(); rn8#nQ>QZ%
sm.executeQuery(sql); // 执行数据查询语句(select) sI,S(VWor
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;,&$ob*/
2)用PreparedStatement来执行sql语句 `A0trC3
String sql; HLruZyN4
sql = "insert into user (id,name) values (?,?)"; 9) ~Ha iVB
PreparedStatement ps = cn.prepareStatement(sql); aP`[O]8j
ps.setInt(1,xxx); B|pdqSI
ps.setString(2,xxx); #q-7#pp
... &pk&8_=f
ResultSet rs = ps.executeQuery(); // 查询 -~HyzX\cZB
int c = ps.executeUpdate(); // 更新 bMjE@S&
ajJ+Jn\
3、处理执行结果 5h!ZoB)n
查询语句,返回记录集ResultSet WF&?OHf2
更新语句,返回数字,表示该更新影响的记录数 n7$21*,
ResultSet的方法 No(p:Snbo
1、next(),将游标往后移动一行,如果成功返回true;否则返回false q33Z.3R
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]!mC5Ea
+<TnE+>j
4、释放连接 cy%S5Rz
cn.close(); }b$W+/M\
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection nyRQ/.3
2c u?2_,
可滚动、更新的记录集 H}f}Y8J{
1、创建可滚动、更新的Statement i|/EA7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Jmcf9g
该Statement取得的ResultSet就是可滚动的 "I
n[= 2w
2、创建PreparedStatement时指定参数 ;5.S"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); M~SbIk<#a<
ResultSet.absolute(9000); z{uRqAG
批量更新 YB?5s`vr9d
1、Statement ]hC6PKJU
Statement sm = cn.createStatement(); 1 Vq)& N
sm.addBatch(sql1); pf%B
sm.addBatch(sql2); *y@Xm~ld
... sSdnH_;&
sm.executeBatch() c
0/vB
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 A])+Pe
2、PreparedStatement
(;(P3h
PreparedStatement ps = cn.preparedStatement(sql); g=q1@ )
{ &?wNL@n
ps.setXXX(1,xxx); #ts;s\!
... Q[Xh{B
ps.addBatch(); _
!r]**
} 65g"$:0
ps.executeBatch(); 7#G8qh<
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8
mFy9{M
EsK.g/d
事务的处理 tpQ?E<O
1、关闭Connection的自动提交 []#>r
k~
cn.setAutoCommit(false); =TcT` ](o
2、执行一系列sql语句 mR|;}u;d
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +/|;<K5_LI
Statement sm ; jVxX! V
sm = cn.createStatement(insert into user...); BK/~2u
sm.executeUpdate(); NKX62 ZC
sm.close(); *l9Wj$vja
sm = cn.createStatement("insert into corp...); 'ai3f
sm.executeUpdate(); L3s1a -K
sm.close(); o)}M$}4
3、提交 s ~Xa=_+D
cn.commit(); ,!i!q[YkL9
4、如果发生异常,那么回滚 R{R'byre
cn.rollback();