java 数据库基本操作 A+wv-~3
1、java数据库操作基本流程 's!-80sd
2、几个常用的重要技巧: ExXM:1 e26
可滚动、更新的记录集 _uu<4c
批量更新 cj|*_}
事务处理 u%d K ig
%_aMl
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 w$5A|%Y+V}
1、取得数据库连接 PS" .R_"
1)用DriverManager取数据库连接 B 2.q3T
例子 ;#)mLsl
String className,url,uid,pwd; JH]K/sC>
className = "oracle.jdbc.driver.OracleDriver"; _0 snAt^iC
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; >(tn "2
uid = "system"; B)h>8 {
pwd = "manager"; X0+fsf<H}
Class.forName(className); 7W9d6i)
Connection cn = DriverManager.getConnection(url,uid,pwd); 0i8hI6d
2)用jndi(java的命名和目录服务)方式 oXt,e
例子 >Dg#9
String jndi = "jdbc/db"; =`C4qC_
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); DV]7.Bm
DataSource ds = (DataSource) ctx.lookup(jndi); l??;3kh1
Connection cn = ds.getConnection(); |__=d+M'
多用于jsp中 QldzQ%4c\
2、执行sql语句 d(*fy}
1)用Statement来执行sql语句 W {.78Zi9K
String sql; hvt@XZT
Statement sm = cn.createStatement(); ? {F{;r
sm.executeQuery(sql); // 执行数据查询语句(select) 6vf\R*D|A
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); *NSlo^R-[
2)用PreparedStatement来执行sql语句 pY^9l3y^
String sql; l t]B#, '
sql = "insert into user (id,name) values (?,?)"; F X1ZG!
PreparedStatement ps = cn.prepareStatement(sql); f|a DTWF
ps.setInt(1,xxx); VzRx%j/i
ps.setString(2,xxx); j%*7feSNC
... =OV2 uq
ResultSet rs = ps.executeQuery(); // 查询 fd8#Ng"1
int c = ps.executeUpdate(); // 更新 %xyX8c{sP
jB^OP1
3、处理执行结果 3rf#Q}"
查询语句,返回记录集ResultSet tllBCuAe
更新语句,返回数字,表示该更新影响的记录数 e}cnX`B
ResultSet的方法 mf|pNiQ,
1、next(),将游标往后移动一行,如果成功返回true;否则返回false s3lwu :4f
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 @#b0T:+v'
mg+k'Myo+
4、释放连接 ~HUZ#rUHm>
cn.close(); PG)_L.7rJ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection K2/E#}/
f!-Sz/ c#
可滚动、更新的记录集 Gwd{#7FM`
1、创建可滚动、更新的Statement NyI;v=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); c! H 9yk
该Statement取得的ResultSet就是可滚动的 Dd2Lx&9
2、创建PreparedStatement时指定参数 m<3v)R[>
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $)e:8jS=
ResultSet.absolute(9000); tnW;E\cR
批量更新
H=zN[MU
1、Statement BSp$F WvT?
Statement sm = cn.createStatement(); h<[+HsI
sm.addBatch(sql1); `:-J+<`
sm.addBatch(sql2); H]qq ~bO[
... mR":z|6
sm.executeBatch() '%3{jc-}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 LnMwx#^*
2、PreparedStatement ,\hYEup
PreparedStatement ps = cn.preparedStatement(sql); _Nu`)m
{ hD 46@
ps.setXXX(1,xxx); g^o_\hp
... `.k5v7!o
ps.addBatch(); It
2UfW
} qZG-Lh
ps.executeBatch(); 4&}\BU*
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 dB|Te "6
a0zG(7.D
事务的处理 NR/-m7#-
1、关闭Connection的自动提交 Xn7[n
cn.setAutoCommit(false); +6%7CC 6
2、执行一系列sql语句 l6B.6
'4)w
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &?$\Y,{
Statement sm ; Cals?u#U=
sm = cn.createStatement(insert into user...); B {i&~k
sm.executeUpdate(); Tj,Nmb>Q7'
sm.close(); rqvU8T7A
sm = cn.createStatement("insert into corp...); 6dT|;koWbm
sm.executeUpdate(); f
Lk"tW
sm.close(); owMuT^x?
3、提交 /;UTC)cJ
cn.commit(); tvWH04T
4、如果发生异常,那么回滚 KHJ=$5r)
cn.rollback();