java 数据库基本操作 85Ms*[g
1、java数据库操作基本流程
31J7# S2
2、几个常用的重要技巧: IKAF%0[R|j
可滚动、更新的记录集 cUS2*7h
批量更新 `(Ei-$
>U&
事务处理 ilpg()
N[zI@>x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 42Ql^ka
1、取得数据库连接 $mp7IZE|
1)用DriverManager取数据库连接 sm\/wlbE
例子 */?L_\7
String className,url,uid,pwd; x{RTI#a.
className = "oracle.jdbc.driver.OracleDriver"; b!_l(2
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; d p_J*8
uid = "system"; WET $H,
pwd = "manager"; 5%,n[qj4IT
Class.forName(className); !)_5 z<
Connection cn = DriverManager.getConnection(url,uid,pwd); l,sYYU+iY
2)用jndi(java的命名和目录服务)方式 $F\&?B1.
例子 QAcvv 0Hv
String jndi = "jdbc/db"; #`}g?6VHo
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); P,tN;c
DataSource ds = (DataSource) ctx.lookup(jndi); | ql!@M(p
Connection cn = ds.getConnection(); vT3LhN+1
多用于jsp中 I8`.eqV
2、执行sql语句 LOe!qt\&
1)用Statement来执行sql语句 4Mg09
String sql; uodO^5"-
Statement sm = cn.createStatement(); 1gH5#_?
sm.executeQuery(sql); // 执行数据查询语句(select) %3"3OOT7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); V}@c5)(j
2)用PreparedStatement来执行sql语句 E2%7 v
String sql; H$\?D+xlf
sql = "insert into user (id,name) values (?,?)"; hoSk
PreparedStatement ps = cn.prepareStatement(sql); QIo|t!7F
ps.setInt(1,xxx); 7Zr jU{
ps.setString(2,xxx); t1IC0'o-
... HHtp.;L/
ResultSet rs = ps.executeQuery(); // 查询 {zmo7~=
int c = ps.executeUpdate(); // 更新 ed*=p
l3.
=ngu*#?c4
3、处理执行结果 (|O;Ci
查询语句,返回记录集ResultSet _VR4|)1g
更新语句,返回数字,表示该更新影响的记录数 x{Gih1
ResultSet的方法 'KyT]OObS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |oO0%#1H
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 bu@Pxz%_
Wpj.G
4、释放连接 nc@ul')
cn.close(); ZFrK'BvbR
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2Uu,Vv
=fG(K!AQ
可滚动、更新的记录集 :UFf6T?
1、创建可滚动、更新的Statement w_A-:S
5C
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); o)1wF
X
该Statement取得的ResultSet就是可滚动的 lywcT! <
2、创建PreparedStatement时指定参数 1\zI#"b ^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); QF-.")Z
ResultSet.absolute(9000); 1mA)=hu
批量更新 Ig$5Ui
1、Statement .[K{;^>
Statement sm = cn.createStatement(); 9H P)@66
sm.addBatch(sql1); F~RUb&*/<
sm.addBatch(sql2); '[Nu;(>a
... .%~
L
sm.executeBatch() dbnH#0i
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <8-I:o]mF
2、PreparedStatement 9x{T"'
PreparedStatement ps = cn.preparedStatement(sql); *4A.R&Vu
{ `Gsh<.w!7
ps.setXXX(1,xxx); t*Lo;]P
... <&W3\/xx
ps.addBatch(); oJXZ}>>iT
} d7KeJ$xy}p
ps.executeBatch(); =X+DC&]%!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?9=yo5M}
?6uh^Qal
事务的处理 \k;raQR4t*
1、关闭Connection的自动提交 P+"#xH
cn.setAutoCommit(false); F(SeD)ml
2、执行一系列sql语句 vs6`oW"{#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /Rt/Efu
Statement sm ; %y8w9aGt
sm = cn.createStatement(insert into user...); Jz3 q
Pr
sm.executeUpdate(); j:{<
sm.close(); & qd:o}
sm = cn.createStatement("insert into corp...); 5z El`h
sm.executeUpdate(); eaF5S'k 4$
sm.close(); V @d:n
3、提交 i-niRu<
cn.commit(); _jeub [
4、如果发生异常,那么回滚 |bd5aRS9
cn.rollback();