java 数据库基本操作 c(JO;=,@9
1、java数据库操作基本流程 GoXHVUyp
2、几个常用的重要技巧: |,f6c
Omf
可滚动、更新的记录集 +g30frg+Gl
批量更新 5lY9
事务处理 KwyXM9h6=
M,lu)~H
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 J(L$pIM
1、取得数据库连接 p 1fnuN |,
1)用DriverManager取数据库连接 (#BA{9T,^
例子 6?~pjMV
String className,url,uid,pwd; N|d@B{a(
className = "oracle.jdbc.driver.OracleDriver"; %%u4('=
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; LRgk9*@,
uid = "system"; 94/}@<d-=
pwd = "manager"; o4795r,jz
Class.forName(className); Yq.@7cJ
Connection cn = DriverManager.getConnection(url,uid,pwd); ,^T2hY`
2)用jndi(java的命名和目录服务)方式 5Ep
例子 3<lDsb(}0A
String jndi = "jdbc/db"; yV`vu/3K
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /iy/2x28>
DataSource ds = (DataSource) ctx.lookup(jndi); Vngi8%YWp
Connection cn = ds.getConnection(); _en 8hi@Z
多用于jsp中 g9.hR8X
2、执行sql语句 M?97F!\U
1)用Statement来执行sql语句 8i"fhN3?Y
String sql; Rh^$0Q*2
Statement sm = cn.createStatement(); 2|EoP-K7
sm.executeQuery(sql); // 执行数据查询语句(select) 5lbh
"m=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); fA5#
2P{
2)用PreparedStatement来执行sql语句 %vzpp\t
String sql; ]|(?i ,p
sql = "insert into user (id,name) values (?,?)"; RUO6Co-
PreparedStatement ps = cn.prepareStatement(sql); IS~oyFS
ps.setInt(1,xxx); ^.7xu/T
ps.setString(2,xxx); u[@*}|uXM
... \:S8mDI^s
ResultSet rs = ps.executeQuery(); // 查询 d{jl&:
int c = ps.executeUpdate(); // 更新 c0~'5Mlp
zSO9 U
3、处理执行结果 x;/3_"$9>\
查询语句,返回记录集ResultSet R/7l2 *
更新语句,返回数字,表示该更新影响的记录数 Kxn=iv^Ir
ResultSet的方法 !Ai;S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false y uq E
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 0&@6NW&Mu
48VsHqG
4、释放连接 I-I5^s
cn.close(); ;!b(b%
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection FeJ5^Gh.
s,8%;\!C
可滚动、更新的记录集 !LA#c'
1、创建可滚动、更新的Statement IuL]V TY
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); u^$ CR
该Statement取得的ResultSet就是可滚动的 %8/$CR
2、创建PreparedStatement时指定参数 x(Z@R\C-a
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
=>U~ligu
ResultSet.absolute(9000); 3m'6 cMQ
批量更新 BDg /pDnwg
1、Statement G<I5%Yo6G
Statement sm = cn.createStatement();
aY~IS?!;
sm.addBatch(sql1); NgQl;$
sm.addBatch(sql2); w6tY6bf}
... A_+WY|#M
sm.executeBatch() X5=7DE]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 O)?0G$0
2、PreparedStatement |k0VJi
PreparedStatement ps = cn.preparedStatement(sql); V^D#i(5
{ Gy5W;,$q
ps.setXXX(1,xxx); qn .
... uB?YJf .T@
ps.addBatch(); TnrMR1Zx
} JP]K\nQx'
ps.executeBatch(); H+Wd#7l,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .0
K8h:I
R:E:Y|&#
事务的处理 &+sN=J.x
1、关闭Connection的自动提交 jdzV&
cn.setAutoCommit(false); }\ F>z
2、执行一系列sql语句 6)8']f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g|oPRC$I'
Statement sm ; VI4d/2e
sm = cn.createStatement(insert into user...); ,o`qB81
sm.executeUpdate(); RL%{VE
sm.close(); OkM>
sm = cn.createStatement("insert into corp...); -llujB%;,e
sm.executeUpdate(); ~Hq
2'
sm.close(); !
^W|;bq
3、提交 }`X$
'
cn.commit(); b]~M$y60q
4、如果发生异常,那么回滚 Hcpw[%(
cn.rollback();