java 数据库基本操作 OW@)6
1、java数据库操作基本流程
dtfOFag4_
2、几个常用的重要技巧: ~OvbMWu
可滚动、更新的记录集 H<<t^,E^.t
批量更新 mTUoFXX[
事务处理 =2QP7W3mg<
:&'jh/vRN
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9y5JV3
1、取得数据库连接 RjO0*$>h
1)用DriverManager取数据库连接 =_m3~=Z
例子 }BL7P-km
String className,url,uid,pwd; mv~?1aIKD
className = "oracle.jdbc.driver.OracleDriver"; zb"4_L@m2
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; PeqW+Q.
uid = "system"; '@M"#`#0
pwd = "manager"; q+p}U}L=
k
Class.forName(className); $0un`&W
Connection cn = DriverManager.getConnection(url,uid,pwd); S
~fz
2)用jndi(java的命名和目录服务)方式 8Lx1XbwK
例子 "$o>_+U
String jndi = "jdbc/db"; qnWM %k
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -OU{99$aS
DataSource ds = (DataSource) ctx.lookup(jndi); o,c}L9nvt
Connection cn = ds.getConnection(); B9$f y).Gp
多用于jsp中 'kY/=*=Q
2、执行sql语句 /
j%~#@
1)用Statement来执行sql语句 Meep
String sql; *l"CIG'
Statement sm = cn.createStatement(); c?. i;4yh
sm.executeQuery(sql); // 执行数据查询语句(select) w%X@os}E
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); U] GD6q
2)用PreparedStatement来执行sql语句 4pQf*l8e
String sql; j|&D(]W/
sql = "insert into user (id,name) values (?,?)"; Mlo,F1'?>
PreparedStatement ps = cn.prepareStatement(sql); Xy!NBh7I
ps.setInt(1,xxx); Yo'Y-h#
ps.setString(2,xxx); p=E#!cn3
... oD\t4]?E
ResultSet rs = ps.executeQuery(); // 查询 2Vf242z_
int c = ps.executeUpdate(); // 更新 yTK3eK
cqJXZ.XC
3、处理执行结果 {I$iD
查询语句,返回记录集ResultSet hwL`9.w
更新语句,返回数字,表示该更新影响的记录数 |o9`h 9i
ResultSet的方法 u7RlxA:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false sP2Uj
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `sso Wn4
W}3%BWn
4、释放连接 %D:VcY9OC
cn.close(); S$$SLy:P
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Cojs;`3iF:
t^zE^:06
可滚动、更新的记录集 :3
Hz!iZM
1、创建可滚动、更新的Statement tvFe_*Ck
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); d4^x,hzV
该Statement取得的ResultSet就是可滚动的 '7oCWHq[
2、创建PreparedStatement时指定参数 ITqAy1m@C
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); GK1nGdT]
ResultSet.absolute(9000); Y*\h?p[,
批量更新 8IxIW0
1、Statement & /T}
Statement sm = cn.createStatement(); m;>G]Sbe
sm.addBatch(sql1); "!AtS
sm.addBatch(sql2); =SeQ- H#
... qGMU>J.;c
sm.executeBatch() Xa#.GrH6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 AH/o-$C&
2、PreparedStatement cb0rkmO
PreparedStatement ps = cn.preparedStatement(sql); Ay 4P_>^
{ ")vtS}Ekt
ps.setXXX(1,xxx); /!?Tv8TPp
... ;|?_C8
ps.addBatch(); 6S3D#SY
} AzZhIhWl">
ps.executeBatch(); 32SkxcfrCK
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )AR-b8..o
:A @f[Y'9
事务的处理 )[ZXPD
1、关闭Connection的自动提交 |nnFjGC`~
cn.setAutoCommit(false); KU
oAxA
2、执行一系列sql语句 phf{b+'#X
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close '/6f2[%Y"
Statement sm ; `5wiXsNjLY
sm = cn.createStatement(insert into user...); w6X:39d
sm.executeUpdate(); ^9 LoxU-
sm.close(); oA~0"}eS
sm = cn.createStatement("insert into corp...); AA=rjB9
sm.executeUpdate(); r*$f^T!|
sm.close(); %k['<BYG<
3、提交 E# 8|h(
cn.commit(); Shy.:XI
4、如果发生异常,那么回滚 .$W}
cn.rollback();