java 数据库基本操作 &N6[*7
1、java数据库操作基本流程 WwtVuc|
2、几个常用的重要技巧: XD0a :T)
可滚动、更新的记录集 6Uq;]@k%
批量更新 Zz/p'3?#
事务处理 4(oU88z
;~d$OM
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 >#l:]T
1、取得数据库连接 S+-$Ih`[
1)用DriverManager取数据库连接 Sj|tR[SAoD
例子 EEK!'[<,sE
String className,url,uid,pwd; pYr+n9)^
className = "oracle.jdbc.driver.OracleDriver"; zks7wt]A
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; LYd:S
uid = "system"; Y`4 LMK[]
pwd = "manager"; J=: \b
Class.forName(className); Q^3{L\6_
Connection cn = DriverManager.getConnection(url,uid,pwd); S&XlMu
2)用jndi(java的命名和目录服务)方式 -vY5h%7kf
例子 t?PqfVSq
String jndi = "jdbc/db"; |mbD q\U
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &.s.g\
DataSource ds = (DataSource) ctx.lookup(jndi); 3T,[
Connection cn = ds.getConnection(); %la1-r~
多用于jsp中 ElDeXLr'
2、执行sql语句 j&Xx{ 4v
1)用Statement来执行sql语句 I_Gz~ qk6
String sql; mD&I6F[s
Statement sm = cn.createStatement(); %eIaH!x:
sm.executeQuery(sql); // 执行数据查询语句(select) wF% RM$
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); rKFnivGT
2)用PreparedStatement来执行sql语句 $M!iQ"bb
String sql; w4}Q6_0v
sql = "insert into user (id,name) values (?,?)"; K{`R`SXD
PreparedStatement ps = cn.prepareStatement(sql); q+*\'H>
ps.setInt(1,xxx); P6La)U`VA
ps.setString(2,xxx); xfI0P0+
... i4h`jFS
ResultSet rs = ps.executeQuery(); // 查询 ,c?(
|tF
int c = ps.executeUpdate(); // 更新 $ xHtI]T
^E8qI8s
3、处理执行结果 q165S
查询语句,返回记录集ResultSet OgC,oj,!/
更新语句,返回数字,表示该更新影响的记录数 (EosLn
h0
ResultSet的方法 8-k`"QI=
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^ +@OiL>&i
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 kN{$-v=K
ISK 8t
4、释放连接 h!|U j
cn.close(); Cj`~ntMN
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +WMXd.iN,
yFb"2
可滚动、更新的记录集 gC iM\Qx
1、创建可滚动、更新的Statement 1jop;{,^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }
S]!W\a
该Statement取得的ResultSet就是可滚动的 jn(!6\n"
2、创建PreparedStatement时指定参数 $cJ fdE
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); YaC[S^p
ResultSet.absolute(9000);
_(8#
批量更新 oPni4^g i
1、Statement zaLPPm&f
Statement sm = cn.createStatement(); }+pwSjsno
sm.addBatch(sql1); 5XB]p|YU~s
sm.addBatch(sql2); \#VWZ\M8a
... _
A#lyp
sm.executeBatch() FJCORa@?_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 GK1nGdT]
2、PreparedStatement Y*\h?p[,
PreparedStatement ps = cn.preparedStatement(sql); 8IxIW0
{ ~xsJML
ps.setXXX(1,xxx); ISFNP&&K
... esBv,b?*
ps.addBatch(); !u8IZpf
} S5ai@Ksf
ps.executeBatch(); {,h_T0D^j
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 N"G\H<n
~]d 9 J
事务的处理 JA9NTu(
1、关闭Connection的自动提交 jXALL8[c
cn.setAutoCommit(false); (GpP=lSSeY
2、执行一系列sql语句 :):vB
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &oHr]=xA
Statement sm ; +>*=~R
sm = cn.createStatement(insert into user...); ji\LC%U-
sm.executeUpdate(); rXMc0SPk
sm.close(); z\ONwMl
sm = cn.createStatement("insert into corp...); |nnFjGC`~
sm.executeUpdate(); VV}"zc^
sm.close(); f+s)A(?3
3、提交 #V]8FW
cn.commit(); |gu@b~8
4、如果发生异常,那么回滚 _b-g^#L%
cn.rollback();