java 数据库基本操作 6VRVk7"
1、java数据库操作基本流程 tBdvk>d
2、几个常用的重要技巧: k5W5 9tz
可滚动、更新的记录集 852$Ui|I
批量更新 V.;0F%zks5
事务处理 `Q}.9s_ri
Q TM+WD
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;sb0,2YyP
1、取得数据库连接 URY%+u
1)用DriverManager取数据库连接 )6Z)z;n]aW
例子 3
nb3rHQ
String className,url,uid,pwd; !i{@B
className = "oracle.jdbc.driver.OracleDriver"; nbhx2@Teqe
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; n0nkv[
uid = "system"; 9NKZE?5P|D
pwd = "manager"; HH8a"Hq)
Class.forName(className); _/7[=e}y
Connection cn = DriverManager.getConnection(url,uid,pwd); tlG&PVvr
2)用jndi(java的命名和目录服务)方式 ;v#~o*
例子 k:R9wo
String jndi = "jdbc/db"; LKztGfy
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Q-BciBh$
DataSource ds = (DataSource) ctx.lookup(jndi); Ywlym\
[+
Connection cn = ds.getConnection(); =v1s@5;~
多用于jsp中 o
KX!{
2、执行sql语句 wN"irXG
1)用Statement来执行sql语句 K@%. T#
String sql; 6<FJ`l]U9
Statement sm = cn.createStatement(); E9QNx62
sm.executeQuery(sql); // 执行数据查询语句(select) 7vgz=-
MZ#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); dEns|r
2)用PreparedStatement来执行sql语句 si0jXue~j\
String sql; m &c8@-T
sql = "insert into user (id,name) values (?,?)"; Fpl<2eBg4
PreparedStatement ps = cn.prepareStatement(sql); ,c}Q;eYc3
ps.setInt(1,xxx);
`<q{8
ps.setString(2,xxx); PJ9JRG7j
... H?M8j] R-)
ResultSet rs = ps.executeQuery(); // 查询 r's4-\
int c = ps.executeUpdate(); // 更新 naW}[y*y;
G$Z8k,g+<7
3、处理执行结果 (8k3z`
查询语句,返回记录集ResultSet k2p{<SO;
更新语句,返回数字,表示该更新影响的记录数 GXJJOy1"!
ResultSet的方法 P7<~S8)Y
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zLC\Rc4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )=ZWn,ZB
wIL5-k,
4、释放连接 ^BSMlKyB
cn.close(); b[VP"KZ ?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .,UpI|b
L)4TW6IUk
可滚动、更新的记录集 B4_0+K H
1、创建可滚动、更新的Statement O>)8< yi$
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); &PgbFy
该Statement取得的ResultSet就是可滚动的 pOpie5)7X
2、创建PreparedStatement时指定参数 v6TH-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $ v$~.
ResultSet.absolute(9000); E.4`aJ@>d
批量更新 <wc=SMmO
1、Statement ?,TON5Fl-
Statement sm = cn.createStatement();
jats)!:
sm.addBatch(sql1); !SKEL6~7
sm.addBatch(sql2); @R(6w{h9
... zr2%|YF
sm.executeBatch() { ~FYiX
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 GS4!c8>
2、PreparedStatement \KDOI 7
PreparedStatement ps = cn.preparedStatement(sql); Z#nj[r!l}
{ jW"C: {Ol;
ps.setXXX(1,xxx); NA !;#!
... D 0\
ps.addBatch(); )$ i7b
} VO/"
ot
ps.executeBatch(); mS0*%[S {
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?UQE;0 B
,d@.@a]
`
事务的处理 >/eQjp?:
1、关闭Connection的自动提交 VctAQ|h^
cn.setAutoCommit(false); DpoRR`
2、执行一系列sql语句 b:WlB[5
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -D`*$rp,
Statement sm ; TBvv(_
sm = cn.createStatement(insert into user...); 4Ts5*_
sm.executeUpdate(); 83Bp_K2\
sm.close(); e(,sFhR
sm = cn.createStatement("insert into corp...); r8}GiP0|
sm.executeUpdate(); (]0ZxWF
sm.close(); [#$z.BoEo
3、提交 &iId<.SiJ
cn.commit(); CXb)k.L
4、如果发生异常,那么回滚 lpj$\WI=
cn.rollback();