java 数据库基本操作 z>+CMH5L)
1、java数据库操作基本流程 Gu{1%bb#kL
2、几个常用的重要技巧: |d&Kr0QIV
可滚动、更新的记录集 c*#$sZ@YA
批量更新 JQ
?8yl
事务处理 x(>XM:|
jA^yUd-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 J,v024TM
1、取得数据库连接 b6;MTz*k>
1)用DriverManager取数据库连接 .Od@i$E>&
例子 E<LH-_$
String className,url,uid,pwd; V?t*c [
className = "oracle.jdbc.driver.OracleDriver"; &u9,|n]O9
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; R[j'<gd.
uid = "system"; YP!}Bf
pwd = "manager"; F+G+XtOS
Class.forName(className); Gmu[UI}w8
Connection cn = DriverManager.getConnection(url,uid,pwd); ,^CG\);
2)用jndi(java的命名和目录服务)方式 Eva&FHRTY
例子 Z wKX$(n
String jndi = "jdbc/db"; x%)oL:ue
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); UK'8cz9
DataSource ds = (DataSource) ctx.lookup(jndi); (Qw >P42J
Connection cn = ds.getConnection(); yuq o ^i
多用于jsp中 -AL^
2、执行sql语句 D
Q4O
1)用Statement来执行sql语句 KD\%B5Jy
String sql; D|Tz{DRG
Statement sm = cn.createStatement(); *B4OvHi)'
sm.executeQuery(sql); // 执行数据查询语句(select)
*pO`sC>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); bfb9A+]3'
2)用PreparedStatement来执行sql语句 ~Q^.7.-T
String sql; hH$9GL{H
sql = "insert into user (id,name) values (?,?)"; >8>s
K(S]
PreparedStatement ps = cn.prepareStatement(sql); Z!q$d/1
ps.setInt(1,xxx); Jl\U~i
ps.setString(2,xxx); \1?'JdN
... GS>YfJ&DZ
ResultSet rs = ps.executeQuery(); // 查询 .5SYN-@
int c = ps.executeUpdate(); // 更新 "8)%XSb
_TdH6[9
3、处理执行结果 K
d#(eGe
查询语句,返回记录集ResultSet ~"bBwPI
更新语句,返回数字,表示该更新影响的记录数 ?Z!R
ResultSet的方法 |pknaz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false HXh:83
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3 q8S
^Et^,I:`
4、释放连接 0T@axQ[%
cn.close(); z2R?GQ5 A
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection d8Cd4qIXX
>}Mw"
可滚动、更新的记录集 `o{_+Li9
1、创建可滚动、更新的Statement n[;)(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); C!K&d,M
该Statement取得的ResultSet就是可滚动的 lRS'M,/
2、创建PreparedStatement时指定参数 )~xH!%4F
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iig4JP'h
ResultSet.absolute(9000); x*j
eCD,
批量更新 //3fgoly
1、Statement `"V}Wq ?I
Statement sm = cn.createStatement(); lwG)&qyVd
sm.addBatch(sql1); rw
2i_,.*~
sm.addBatch(sql2); d=\TC'd"{
... :rk6Stn$z
sm.executeBatch() Ii3F|Vb G
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 vytO8m%U
2、PreparedStatement 7#&Q-3\:
PreparedStatement ps = cn.preparedStatement(sql); y9T5
{ wU/fGg*M2
ps.setXXX(1,xxx); .2|(!a9W
... 1TzwXX7
ps.addBatch(); zk@s#_3ct
} x!7!)]h
ps.executeBatch(); i$.! 8AV6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ]l=CiG4!M
r0OP !u
事务的处理 D\-DsT.H
1、关闭Connection的自动提交 nXuy&;5TL,
cn.setAutoCommit(false); @d8Nr:
2、执行一系列sql语句 6h)
&h1Yd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close c<Ud[x.
Statement sm ; 1JOoICjB
sm = cn.createStatement(insert into user...); >`yRL[c;
sm.executeUpdate(); [k%u$
sm.close(); k8+U0J_{'
sm = cn.createStatement("insert into corp...); SEWdhthP
sm.executeUpdate(); +~==qLsU
sm.close(); b'4}=Xpn
3、提交 trA ^JY
cn.commit(); zII^Ny8D
4、如果发生异常,那么回滚 rNm_w>bq
cn.rollback();