java 数据库基本操作 DGJt$o=&@
1、java数据库操作基本流程 v;ZIqn"
2、几个常用的重要技巧: ]n
'FD|
可滚动、更新的记录集 L5RBe
批量更新 1
k\~%
事务处理 uLq%Nu
S2\|bs7;J,
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %2ZWSQD
1、取得数据库连接 [dIlt"2fV
1)用DriverManager取数据库连接 *RllKP Y)
例子 GE!fh1[[u
String className,url,uid,pwd; q(s&2|
className = "oracle.jdbc.driver.OracleDriver"; KmX?W/%R
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; xsERn F>`
uid = "system"; Z1Pdnc7S[
pwd = "manager"; *p.70,5,
Class.forName(className); K9=f`JI9
Connection cn = DriverManager.getConnection(url,uid,pwd); INF}~DN]
2)用jndi(java的命名和目录服务)方式 _qp^+
例子 VSDG_:!K
String jndi = "jdbc/db"; +d289"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ,&ld:v?~
DataSource ds = (DataSource) ctx.lookup(jndi); rk)h_zN
Connection cn = ds.getConnection(); 8r\;8all
多用于jsp中 Y7GHIzX
2、执行sql语句 7H$wpn
Zln
1)用Statement来执行sql语句 9k*1_
String sql; Mrly(*!U"@
Statement sm = cn.createStatement(); ZD#{h J-
sm.executeQuery(sql); // 执行数据查询语句(select) E5. @=U,c
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); tg"NWp6
2)用PreparedStatement来执行sql语句 Z[%vO?,
String sql; yk0#byW`
sql = "insert into user (id,name) values (?,?)"; _!C M
PreparedStatement ps = cn.prepareStatement(sql); (>
VD#n
ps.setInt(1,xxx); x*a^msY%
ps.setString(2,xxx); %|o2d&i
... ~&%&Z
ResultSet rs = ps.executeQuery(); // 查询 8-geBlCE,
int c = ps.executeUpdate(); // 更新 /DE`>eJY
e .(
3、处理执行结果 iji2gWV}h
查询语句,返回记录集ResultSet kNC]q,ljt5
更新语句,返回数字,表示该更新影响的记录数 zcCGREe=
ResultSet的方法 %$ ^eY'-'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false }pOJ M&I
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
c W^
_@A%t&l
4、释放连接 c0.? d]
cn.close(); !McRtxq?~
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Scz/2vNi`
Z_WJgH2c
可滚动、更新的记录集 XM:Y(#?l
1、创建可滚动、更新的Statement qGhwbg
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); t +h}hL
该Statement取得的ResultSet就是可滚动的 <d]
t{M62W
2、创建PreparedStatement时指定参数 m-AW}1:\f
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); a[hQ<@1O
ResultSet.absolute(9000); 8=DZ;]XD.
批量更新 i"OY=iw-N
1、Statement LG:Mksd8=4
Statement sm = cn.createStatement(); CZ|h` ";P2
sm.addBatch(sql1); )2g-{cYv
sm.addBatch(sql2); cIB[D.
... -,pw[R
sm.executeBatch() !+{$dB>a
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 m5kt
O^EU
2、PreparedStatement GI[XcK^*w
PreparedStatement ps = cn.preparedStatement(sql); `\M}~
{ b6ui&Y8z
ps.setXXX(1,xxx); ,4Qct=%L_
... .:A&5Y-
ps.addBatch();
v7#`b}'W
} h%+6y
ps.executeBatch(); O]-s(8Oo3
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 x!;;;iS
$Y=xu2u)
事务的处理 `#y?:s]e
1、关闭Connection的自动提交 Ojs^-R_
cn.setAutoCommit(false); y#?AW`|
2、执行一系列sql语句 6[S-%|f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |L%d^m
Statement sm ; z3C@0v=u>
sm = cn.createStatement(insert into user...); }e8u p*#me
sm.executeUpdate(); l<dtc[
sm.close(); V4tObZP3Ff
sm = cn.createStatement("insert into corp...); AB[#
sm.executeUpdate(); pGT?=/=*
sm.close(); i+4!nf{K
3、提交 p8|u 0/;k
cn.commit(); g;._Q
4、如果发生异常,那么回滚 C~q&
cn.rollback();