java 数据库基本操作 B007x{-L
1、java数据库操作基本流程 ZKsQ2"8{M
2、几个常用的重要技巧: 8on[%Vk
可滚动、更新的记录集 JFJIls
批量更新 oQBiPN+v.3
事务处理 ^fZGX<fH
D5[VK`4Z
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 n` #+L~X
1、取得数据库连接 z\h,SX<U
1)用DriverManager取数据库连接 W%zmD Hk~
例子 qj;l,Kua
String className,url,uid,pwd; {3SdX
className = "oracle.jdbc.driver.OracleDriver"; 1HXlHic
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; )v-Cj_W5]"
uid = "system"; ;Bnr='[
pwd = "manager"; T:)% P6/
Class.forName(className); 6 <r2*`
Connection cn = DriverManager.getConnection(url,uid,pwd); YZ{jP?x
2)用jndi(java的命名和目录服务)方式 \v s%U}IrO
例子 T"A^[r*
String jndi = "jdbc/db"; t!l/` e%J
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); wjg}[R@!
DataSource ds = (DataSource) ctx.lookup(jndi); ${0%tCE
Connection cn = ds.getConnection(); d.b?!kn
多用于jsp中 6o9sR)c
?
2、执行sql语句 XL?Aw
1)用Statement来执行sql语句 $OT}`Te~
String sql; E.4n}s
Statement sm = cn.createStatement(); <q1'Li)_R
sm.executeQuery(sql); // 执行数据查询语句(select) jXH0BPa,
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); d"p2Kx'*3
2)用PreparedStatement来执行sql语句 @!-aR u
String sql; n1JC?+
sql = "insert into user (id,name) values (?,?)"; UJ9q-r
PreparedStatement ps = cn.prepareStatement(sql); $KH@,;Xz
ps.setInt(1,xxx); wC(XRqlE
ps.setString(2,xxx); E.U0qK],
... sMN>wbHwh[
ResultSet rs = ps.executeQuery(); // 查询 2Z-,c;21
int c = ps.executeUpdate(); // 更新 t3Qm-J}wSB
7rJ9
}/<I
3、处理执行结果
B[Ix?V4yy
查询语句,返回记录集ResultSet kYmo7
更新语句,返回数字,表示该更新影响的记录数 v s w7|
ResultSet的方法 SkriX\p
1、next(),将游标往后移动一行,如果成功返回true;否则返回false s?~8O|Mu'
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 f^ywW[dF
/H.(d 4C
4、释放连接 \ p1K(H
cn.close(); T:dX4=z
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Y+OYoI
<XY;fhnB
可滚动、更新的记录集 Iy6p>z|
1、创建可滚动、更新的Statement i)GeX:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); e%'z=%(
该Statement取得的ResultSet就是可滚动的 vx PDC~3;
2、创建PreparedStatement时指定参数 q!9^#c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); @OBHAoz%/
ResultSet.absolute(9000); tu7+LwF7
批量更新 {rtM%%l
1、Statement @-}D7?
Statement sm = cn.createStatement(); $8EV,9^U
sm.addBatch(sql1); A4}JZi6@
sm.addBatch(sql2); IsWcz+1n
... ^#}dPGm
sm.executeBatch() `X3Xz!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 rO5u~"v]
2、PreparedStatement J.*[gt%O|
PreparedStatement ps = cn.preparedStatement(sql); mQmBf|Rl
{ W{L
ps.setXXX(1,xxx); 8H&_, ;
... Y>(ZsHu
ps.addBatch(); mL8A2>Gig
} -qs(2^
ps.executeBatch(); ,*q#qW!!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8x!+tw7
g&|4
事务的处理 T-hU+(+hg
1、关闭Connection的自动提交 9*7Hoi4Ji
cn.setAutoCommit(false); [0d-CEp[
2、执行一系列sql语句 JTSq{NN
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close v&k>0lV,^
Statement sm ; RI#lI~&)
sm = cn.createStatement(insert into user...); 782[yLyv
sm.executeUpdate(); C+X)">/+L
sm.close(); k,
$I59
sm = cn.createStatement("insert into corp...); 4!NfQk>X
sm.executeUpdate(); J(3gT}z-
sm.close(); T_(qN;_
3、提交 Fl8w7LcF7
cn.commit(); i# CaKS
4、如果发生异常,那么回滚 / c4;3>IS
cn.rollback();