java 数据库基本操作 SCurO9RN
1、java数据库操作基本流程 `B'4"=(
2、几个常用的重要技巧: E./__Mz@
可滚动、更新的记录集 r6n5 Jz
批量更新 ^b"bRQqm
事务处理 NYjS
o3F|#op
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 3@yTzaq6
1、取得数据库连接 3Rd`Ysp
1)用DriverManager取数据库连接 XD^dlL
例子 )8$:DW;
String className,url,uid,pwd; "X5_-l
className = "oracle.jdbc.driver.OracleDriver"; }(ma__Ao
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; |}M0,AS
uid = "system"; W]O@DS zR
pwd = "manager"; _V& !4Zd9:
Class.forName(className); 7 DY WdDX
Connection cn = DriverManager.getConnection(url,uid,pwd); 3ximNQ}S
2)用jndi(java的命名和目录服务)方式 g8I!E$
例子 5pM&h~M
String jndi = "jdbc/db"; qx2E-PDL;<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _r\$NgJIM
DataSource ds = (DataSource) ctx.lookup(jndi); zj>aaY
Connection cn = ds.getConnection(); =naR{pI
多用于jsp中 3I"NI.>*
2、执行sql语句 PFS;/
1)用Statement来执行sql语句 veUa|Bx.(v
String sql; KdT[*-
Statement sm = cn.createStatement(); T-|9o|~z
sm.executeQuery(sql); // 执行数据查询语句(select) pWs\.::B
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~)q g
2)用PreparedStatement来执行sql语句 bVoU|`c
String sql; !K3})& w
sql = "insert into user (id,name) values (?,?)"; 4^DVW*OiI
PreparedStatement ps = cn.prepareStatement(sql); J7BFk
?=
ps.setInt(1,xxx); ;} l T
ps.setString(2,xxx); O' +"d%2'
... u8YB)kG
ResultSet rs = ps.executeQuery(); // 查询 Kt
W6AZJ
int c = ps.executeUpdate(); // 更新 :dP~.ZY7
D~#Ei?aH
3、处理执行结果 I^~=,D
查询语句,返回记录集ResultSet nbI=r+
更新语句,返回数字,表示该更新影响的记录数 .,3Zj /
ResultSet的方法 d2rL 8jW
1、next(),将游标往后移动一行,如果成功返回true;否则返回false )K~w'TUr
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 hv*>%p
2fl4h<V
4、释放连接 01udlW.
cn.close(); Ji;SY{~kv
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection OAv>g pw
QR<`pmB~y
可滚动、更新的记录集 VFv9Q2/.
1、创建可滚动、更新的Statement CqqXVF3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Q48+O?&
该Statement取得的ResultSet就是可滚动的 25:Z;J>
2、创建PreparedStatement时指定参数 3bC+Mco
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); LVnHt}
ResultSet.absolute(9000); D+Cm<ZT~
批量更新 lT]=&m>
1、Statement ![ZmV
Statement sm = cn.createStatement(); !
ja[4.
sm.addBatch(sql1);
(}Sr08m
sm.addBatch(sql2); h
T<n1q~
... 8L%M<JRg~
sm.executeBatch() ]q{
PDZ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 TyF{tuF
2、PreparedStatement !X|k"km"
PreparedStatement ps = cn.preparedStatement(sql); l&Z
Sm
{ #,L~w
ps.setXXX(1,xxx); !@G)$g=<
... ,CciTXf
ps.addBatch(); fXO_g
} #^6^
ps.executeBatch(); <l$P&jSF3
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 B0d%c&N${
-4w%Iy
事务的处理 %j7:tf=
1、关闭Connection的自动提交 _%y4q%#
cn.setAutoCommit(false); DAdYg0efex
2、执行一系列sql语句 B**Nn!}0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close nnwJYEi
Statement sm ; c%z'xM
sm = cn.createStatement(insert into user...); -v]Qhf&>
sm.executeUpdate(); R(k}y,eh.`
sm.close();
`0bP0^w
sm = cn.createStatement("insert into corp...); ExVDkt0
sm.executeUpdate(); oFCgu{\kt
sm.close(); 3J~0O2
3、提交 3`*Kav>"
cn.commit(); =su]w2,Iy
4、如果发生异常,那么回滚 /c` ^iPb
cn.rollback();