java 数据库基本操作 "LH* T
1、java数据库操作基本流程 iJK rNRj
2、几个常用的重要技巧: T]J#>LBd
可滚动、更新的记录集 zzBq b\Ky
批量更新 JYWc3o6
事务处理 qS+I lg
3H47 vm(`
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [ w1"
1、取得数据库连接 \8X8NCM
1)用DriverManager取数据库连接 (vf5qF^
例子 FwGMrJW
String className,url,uid,pwd; c'6$`nC
className = "oracle.jdbc.driver.OracleDriver"; F1o"H/:n
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ?rH=< #@
uid = "system"; > 'KQL?!F
pwd = "manager"; 6<A3H$3b
Class.forName(className); Ti9cN)lq&
Connection cn = DriverManager.getConnection(url,uid,pwd); Y_Lsmq2!
2)用jndi(java的命名和目录服务)方式 ) N"gW*
例子 T't^pO-`
String jndi = "jdbc/db"; P5P<-T{-c
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); t(MlZ>H
DataSource ds = (DataSource) ctx.lookup(jndi); ;"nEEe]?
Connection cn = ds.getConnection(); JhDjY8?86
多用于jsp中 M$gy J!Pb
2、执行sql语句 }q
?iJ?P
1)用Statement来执行sql语句 wEMUr0Hq
String sql; vP'R7r2Yx
Statement sm = cn.createStatement(); V*'9yk"
sm.executeQuery(sql); // 执行数据查询语句(select) uyG4zV\h*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ()>\D
2)用PreparedStatement来执行sql语句 VuZmX1x)N
String sql; aV(*BE/@F
sql = "insert into user (id,name) values (?,?)"; ;o3
.<"
PreparedStatement ps = cn.prepareStatement(sql); Phgn|
ps.setInt(1,xxx); r/O(EW#=8
ps.setString(2,xxx); 1^zF/$%
... 1ck2Gxn
ResultSet rs = ps.executeQuery(); // 查询 ;|/7o@$n
int c = ps.executeUpdate(); // 更新 D#m+w
dYV)lMJ*
3、处理执行结果 +uwjZN'9a
查询语句,返回记录集ResultSet $9 DZ5"
更新语句,返回数字,表示该更新影响的记录数 c/2OR#$t
ResultSet的方法 |#2<4sd
1、next(),将游标往后移动一行,如果成功返回true;否则返回false km<~Hw>Z
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 WuGm~<NS
#G{T(0<F
4、释放连接 6U+#ADo
cn.close(); >uJrq""+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection c*1x*'j.
?I/,r2ODLh
可滚动、更新的记录集 c@q>5fR/c
1、创建可滚动、更新的Statement l2`8]Qr
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); T)Nis~
该Statement取得的ResultSet就是可滚动的 %r!#
2、创建PreparedStatement时指定参数 IW BVfN->}
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); j ^!J:Bj
ResultSet.absolute(9000); Mc6Cte]3|
批量更新 (x$k\H
1、Statement *j*jA/
Statement sm = cn.createStatement(); O:BP35z_F
sm.addBatch(sql1); cq9Q7<&MF
sm.addBatch(sql2); wA~Nfn
^
... (wY%$kW4
sm.executeBatch() #/jHnRrQ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 y=j[v},4
2、PreparedStatement \A~
'&
PreparedStatement ps = cn.preparedStatement(sql); <m6I)}K
{ .$OInh
ps.setXXX(1,xxx); .N+xpxdG,
... ``E;!r="v
ps.addBatch(); 7kwG_0QO
} */+s^{W7
ps.executeBatch(); =}"hC`3e
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 &S-& 'ZAY
E8dp
事务的处理 )
k2NF="o
1、关闭Connection的自动提交 h1gb&?w5P
cn.setAutoCommit(false); C1do]1VH
2、执行一系列sql语句 V_1# 7
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close T8(wzs
Statement sm ; /g9{zR [
sm = cn.createStatement(insert into user...); ]`kvq0Gyb
sm.executeUpdate(); m{5$4v,[
sm.close(); cU6#^PFu
sm = cn.createStatement("insert into corp...); 1c4%g-]7
sm.executeUpdate(); Rj&7|z
sm.close(); jlP7'xt1%
3、提交 A X#!9-m3
cn.commit(); ,Ex\\p-
4、如果发生异常,那么回滚 :y
%~9=
cn.rollback();