java 数据库基本操作 &|GH@^)@
1、java数据库操作基本流程 N wk
2、几个常用的重要技巧: )-&@8`
可滚动、更新的记录集 t,|Apl]
批量更新 O@a OKk
事务处理 E4892B:`
?96r7C|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 xOj#%;
1、取得数据库连接 v.Bwg7R3
1)用DriverManager取数据库连接 A&t8C8,
例子 `+n#CWZ"Y
String className,url,uid,pwd; Yu_*P-Ja6
className = "oracle.jdbc.driver.OracleDriver"; J4::.r
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; y,x 2f%x
uid = "system"; MLHCBRi
pwd = "manager"; Sc>mw
Class.forName(className); Cy$~H
Connection cn = DriverManager.getConnection(url,uid,pwd); [#uhMn^
2)用jndi(java的命名和目录服务)方式 )H
W
例子 m1;Htw
String jndi = "jdbc/db"; h@$SJe(hl
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +d\o|}c
DataSource ds = (DataSource) ctx.lookup(jndi); 6GunEYK!N8
Connection cn = ds.getConnection(); -^m?%_<50l
多用于jsp中 xn2 nh@;
2、执行sql语句 vkTu:3Qe
1)用Statement来执行sql语句 4uOR=+/l
String sql; 2{b/*w
Statement sm = cn.createStatement(); K-TsSW$}
sm.executeQuery(sql); // 执行数据查询语句(select) -@(LN%7!C
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %"mI["{
2)用PreparedStatement来执行sql语句 q *&H
String sql; c8X;4
My
sql = "insert into user (id,name) values (?,?)"; >2{Y5__+e
PreparedStatement ps = cn.prepareStatement(sql); uK" T~
ps.setInt(1,xxx); $\J5l$tU
ps.setString(2,xxx); p-.kBF
... O^8ZnN_+
ResultSet rs = ps.executeQuery(); // 查询 ;O`f+rG~
int c = ps.executeUpdate(); // 更新 dfdK%/' $(
Ip{R'HG/
3、处理执行结果 k+ t(u]
查询语句,返回记录集ResultSet OXrm!'
更新语句,返回数字,表示该更新影响的记录数 iRsB|7v[ ,
ResultSet的方法 -z`FKej
1、next(),将游标往后移动一行,如果成功返回true;否则返回false jSE)&K4nI
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $lT8M-yK\
"D.<~!
4、释放连接 Gb`)d
cn.close(); S2'a i
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection zBy} > Jx
.yy*[56X
可滚动、更新的记录集 HC$%"peN1b
1、创建可滚动、更新的Statement Wf3BmkZzz
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \HLo%]A@M
该Statement取得的ResultSet就是可滚动的 !lNyoX/
2、创建PreparedStatement时指定参数 ;
oa+Z:;f
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); vEg%ivj3
ResultSet.absolute(9000); 0QZT<Zs
批量更新 X|{T ljn
1、Statement )]C]K B
Statement sm = cn.createStatement(); rk1,LsZVS
sm.addBatch(sql1); #E!^oZm<Z
sm.addBatch(sql2); #b[bgxm
... ,.9 lz
sm.executeBatch() VNWB$mM.2
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 JGHj(0j
2、PreparedStatement D{B?2}X
PreparedStatement ps = cn.preparedStatement(sql); \"ahs7ABT
{ N0w?c 5>
ps.setXXX(1,xxx); O +o)z6(
... FM6{%}4
ps.addBatch(); )&O2l
} aDRcVA$*
ps.executeBatch(); x[{\Aw>$.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 V _~lME
Jd7chIK
事务的处理 M99ku'
1、关闭Connection的自动提交 6m?<"y8]
cn.setAutoCommit(false); XF(D%ygeC
2、执行一系列sql语句 =Iop
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |-V:#1wR.]
Statement sm ; &233QRYM
sm = cn.createStatement(insert into user...); c0Ih$z
sm.executeUpdate(); 9 o,`peH
sm.close(); o+.L@3RT4
sm = cn.createStatement("insert into corp...); {FFdMdxy-
sm.executeUpdate(); bSw^a{~)
sm.close(); ;EJ!I+
3、提交 L/ibnGhq]
cn.commit(); [>v1JN
4、如果发生异常,那么回滚 Cqnuf5e>L
cn.rollback();