java 数据库基本操作 ;pt.)5
1、java数据库操作基本流程 M3!4,_!~
2、几个常用的重要技巧: 'l $ViNq;
可滚动、更新的记录集 '37 <+N
批量更新 'OI(MuSn
事务处理 UK5u"@T
k2/t~|5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 h{ T{3
1、取得数据库连接 R5N~%Dg)3
1)用DriverManager取数据库连接 ^Eif~v
例子 dR!x)oO=
String className,url,uid,pwd; SZD7"m4
className = "oracle.jdbc.driver.OracleDriver"; B|ctauJ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; vD76IG j m
uid = "system"; 3$4I
pwd = "manager"; 3w}ul~>j
Class.forName(className);
G *
=>
Connection cn = DriverManager.getConnection(url,uid,pwd); w* \JA+
2)用jndi(java的命名和目录服务)方式 2sYz$ZGC"#
例子 &mkL4jXG
String jndi = "jdbc/db"; ,wZq~;2
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); a[jNT$8
DataSource ds = (DataSource) ctx.lookup(jndi); *nB-]
w/
Connection cn = ds.getConnection(); n{(,r'
多用于jsp中 #'4Psz
2、执行sql语句 !.{"Ttn;s
1)用Statement来执行sql语句 HdRwDW@7=
String sql; K"cV7U rE
Statement sm = cn.createStatement(); :Q ?p^OC
sm.executeQuery(sql); // 执行数据查询语句(select) j[4l'8Ek
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Uc9hv?
2)用PreparedStatement来执行sql语句 E&dxM{`
String sql; J"K(nKXO_?
sql = "insert into user (id,name) values (?,?)"; 0IyT(1hS
PreparedStatement ps = cn.prepareStatement(sql); Z5eM
ps.setInt(1,xxx); S2
MJb
ps.setString(2,xxx); %-<6Z9otc
... '.]<lh!
ResultSet rs = ps.executeQuery(); // 查询 X*M2 O%g`L
int c = ps.executeUpdate(); // 更新 q;.LK8M
VNwOD-b/]
3、处理执行结果 =w7+Yt
查询语句,返回记录集ResultSet Fg0!2MKq*
更新语句,返回数字,表示该更新影响的记录数 q<[o 4qY
ResultSet的方法 O-!Q~;3][
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ko"xR%Q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 MS\?+8|SV(
U+[h^M$U
4、释放连接 C(vQR~_
cn.close(); vs@u*4.Ut<
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection R`M@;9I.@
HLPY%VeD
可滚动、更新的记录集 K^IB1U$
1、创建可滚动、更新的Statement erOj(ce
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |>b;M,`OO
该Statement取得的ResultSet就是可滚动的 Cx&l0ZXHEX
2、创建PreparedStatement时指定参数 wQ8<%qi"L
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [-Xah]g
ResultSet.absolute(9000); Sa@T#%oU
批量更新 I~4!8W-Y
1、Statement ?kS#g
Statement sm = cn.createStatement(); +&G]\WX<
sm.addBatch(sql1); X6=o vm
sm.addBatch(sql2); LTuT"}dT[
... %CQv&d2
sm.executeBatch() r}}2Kl
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !6hV|2aJy
2、PreparedStatement & jm1
PreparedStatement ps = cn.preparedStatement(sql); mV+9*or
{ ~=9S AJr]
ps.setXXX(1,xxx); ^%0^DN
... yd[4l%G(zS
ps.addBatch(); lYmxd8
} c]"w0a-`^@
ps.executeBatch(); j /@<=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 tJ
.Ln
Z29LtKr
事务的处理 ! F<::fN
1、关闭Connection的自动提交 7g:Lj,Z4L
cn.setAutoCommit(false); -@@
O<M^
2、执行一系列sql语句 53>(2 _/[r
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close <d O~;
Statement sm ; S VypR LVB
sm = cn.createStatement(insert into user...); 5}a.<
sm.executeUpdate(); K+~1z>&
sm.close(); RKp9[^/?
sm = cn.createStatement("insert into corp...); ~[=d{M!$W
sm.executeUpdate(); D=K{(0{"/,
sm.close(); G
@EEh.s9
3、提交 v`S ;.iD
cn.commit(); O$N;a9g
4、如果发生异常,那么回滚 ;.^!
7j
cn.rollback();