java 数据库基本操作 gZa/?[+
1、java数据库操作基本流程 BMubN
2、几个常用的重要技巧: QucDIZ
可滚动、更新的记录集 |Z]KF>S]
批量更新 l;*/F`>c
事务处理 PI
KQ}aq=
]/l"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 "Di27Rq
1、取得数据库连接 :O`7kZ]=n
1)用DriverManager取数据库连接 ~d0:>8zQR
例子 OT1
String className,url,uid,pwd; ~UrKyA
className = "oracle.jdbc.driver.OracleDriver"; l@;UwnI
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #[|~m;K(w
uid = "system"; L-&N*
pwd = "manager"; )-98pp7~BB
Class.forName(className); =mVWfFL
Connection cn = DriverManager.getConnection(url,uid,pwd); 7_OC&hhL
2)用jndi(java的命名和目录服务)方式 w_c)iJ
例子 y^PQgzm]
String jndi = "jdbc/db"; ,g69 ?w
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); r[doN{%
DataSource ds = (DataSource) ctx.lookup(jndi); 75@!j[QL<
Connection cn = ds.getConnection(); cB$OkaG#
多用于jsp中 #@ClhpLD
2、执行sql语句 ]><K8N3Z
1)用Statement来执行sql语句 oRf.34
String sql; F52%og~N
Statement sm = cn.createStatement(); `SFA`B)[5@
sm.executeQuery(sql); // 执行数据查询语句(select) AcZ{B<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2TFb!?/RQ
2)用PreparedStatement来执行sql语句 #&V7CYJ
String sql; k#eH
Q!
sql = "insert into user (id,name) values (?,?)"; mS\gh)<h
PreparedStatement ps = cn.prepareStatement(sql); LtIR)EtB]
ps.setInt(1,xxx); #Hn<4g"AjM
ps.setString(2,xxx); r 6.`9
...
H7`JqS
ResultSet rs = ps.executeQuery(); // 查询 [Lck55V+Q
int c = ps.executeUpdate(); // 更新 xq6
eu
9
d#-scv}s5
3、处理执行结果 !,Ou:E?Bb
查询语句,返回记录集ResultSet uDtml$9rN
更新语句,返回数字,表示该更新影响的记录数 Vd+qi~kA
ResultSet的方法 zd%n)jlwR
1、next(),将游标往后移动一行,如果成功返回true;否则返回false :B^YK].
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 f ZEyXb
A-n@:` n~
4、释放连接 Mi>!
cn.close(); lu_kir~
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection gxKL
yZO!
;mT|0&o>#
可滚动、更新的记录集
kM:Z(Z7$
1、创建可滚动、更新的Statement 'E\/H17
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .Us)YVbk
该Statement取得的ResultSet就是可滚动的 ^sF/-/ {?U
2、创建PreparedStatement时指定参数 {l
E\y9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 0W_olnZ
ResultSet.absolute(9000); q8m{zSr
批量更新 WGmXq.
1、Statement (vR9vOpJ
Statement sm = cn.createStatement(); 8v<802
sm.addBatch(sql1); )WBp.j /#
sm.addBatch(sql2); FTF`-}Hz
... {[|je]3v
sm.executeBatch() l|kGp~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ftb .CPWI
2、PreparedStatement T!f+H?6
PreparedStatement ps = cn.preparedStatement(sql); 8"'Z0
Ey
{ {PGiNY%q
ps.setXXX(1,xxx); u=6LPwiI
... k)3b0T@b
ps.addBatch(); 2_/H,
} lXT+OJF
ps.executeBatch(); >z'T"R/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 yG'
5:
<`Xt?K
事务的处理 ^P!(*k#T
1、关闭Connection的自动提交 JT,[;
cn.setAutoCommit(false); ngt?9i;N
2、执行一系列sql语句 9ZD>_a
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +^6a$ N
Statement sm ; MJ\^i4
sm = cn.createStatement(insert into user...); euMJ c
sm.executeUpdate(); #Dz. 58A
sm.close(); r"_U-w
sm = cn.createStatement("insert into corp...); ^ g'P
H{68
sm.executeUpdate(); 5i0vli/L
sm.close(); 7DZZdH$Fm
3、提交 YHp]O+c
cn.commit(); e0"80"D
4、如果发生异常,那么回滚 ]lqe,>
cn.rollback();