java 数据库基本操作 aaCRZKr
1、java数据库操作基本流程 J.XhP_aT
2、几个常用的重要技巧: j3;W-c`5
可滚动、更新的记录集 gBhX=2%
批量更新 @@U
事务处理 >A X_"Q~
w^
z ftm
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :%J;[bS+
1、取得数据库连接 \By_mw
1)用DriverManager取数据库连接 9v`sSTlSd
例子 <(@S;?ZEW
String className,url,uid,pwd; 8Cp@k=
className = "oracle.jdbc.driver.OracleDriver"; Z\`SDC
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; O2ktqAWx@
uid = "system"; >I5Wf/$
pwd = "manager"; VnkhY
Class.forName(className); ?xH{7)dO
Connection cn = DriverManager.getConnection(url,uid,pwd); Q"u2<
2)用jndi(java的命名和目录服务)方式 (|Gwg \r
例子 EK=0oy[
String jndi = "jdbc/db"; (?8i^T?WP=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ru2M"]T
DataSource ds = (DataSource) ctx.lookup(jndi); EC8Z. Uu
Connection cn = ds.getConnection(); 8)?&eE'
多用于jsp中 n0co*
]X+k
2、执行sql语句 -.?
@f
tY
1)用Statement来执行sql语句 b<4nljbx
String sql; !`H{jwH
Statement sm = cn.createStatement(); /"st
sF
sm.executeQuery(sql); // 执行数据查询语句(select) R|(X_A
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); NYP3u_
QX
2)用PreparedStatement来执行sql语句 ~Yg)8
String sql; !9NF@e'&!
sql = "insert into user (id,name) values (?,?)"; A32Sdr'D
PreparedStatement ps = cn.prepareStatement(sql); ?2da6v,t
ps.setInt(1,xxx); f!yl&ulKU
ps.setString(2,xxx); 5j.@)XXe
... "Hz%0zP&
ResultSet rs = ps.executeQuery(); // 查询 kP[fhOpn
int c = ps.executeUpdate(); // 更新 }"WovU{*s
(_ :82@c
3、处理执行结果
0LL65[
查询语句,返回记录集ResultSet HP_h!pvx
更新语句,返回数字,表示该更新影响的记录数 )e'F[
ResultSet的方法 7glf?oE
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^`lrKk
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }JST(d&
TA/hj>rV
4、释放连接 b3[[ Ah-
cn.close(); YYFS
({
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection j0+D99{R
e#k rr
可滚动、更新的记录集 ]zyT_}&
1、创建可滚动、更新的Statement AN:s%w2
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); f/8&-L
该Statement取得的ResultSet就是可滚动的 >SvS(N{
2、创建PreparedStatement时指定参数 mMl len
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); R\3v=PR[
ResultSet.absolute(9000); |-{e!&
批量更新 bws}'#-*
1、Statement iR9duP+
Statement sm = cn.createStatement(); xg,
9~f[
sm.addBatch(sql1); ,N,@9p
sm.addBatch(sql2); 24 [cU
... u? >x
sm.executeBatch() cSB_b.@"1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 r vq{Dfo=
2、PreparedStatement V6d,}Z+"z'
PreparedStatement ps = cn.preparedStatement(sql); .!L{yU,
{ "O9n|B
ps.setXXX(1,xxx); r`sKe
&
... l
lcq~*zz
ps.addBatch();
Nb3O>&J
} x?B`p"ifS
ps.executeBatch(); @<$m`^H
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 v)O].Hd
W0mvwYON[
事务的处理 h(AL\9{=}
1、关闭Connection的自动提交 R"HV|Dm|m
cn.setAutoCommit(false); `u_MdB}<x;
2、执行一系列sql语句 &F#eYEuy
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close VhLfSN>W
Statement sm ; X,G"#j^
sm = cn.createStatement(insert into user...); n+&8Uk
sm.executeUpdate(); P(I%9
sm.close();
Ws2?sn#x
sm = cn.createStatement("insert into corp...); ji4bz#/B0
sm.executeUpdate(); lY@2$q9BT
sm.close(); `5oXf
3、提交 ^Tj{}<yT
cn.commit(); 4zhh**]B
4、如果发生异常,那么回滚 2 f%+1uU
cn.rollback();