java 数据库基本操作 HAdg/3Hw
1、java数据库操作基本流程 GY'%+\*tj
2、几个常用的重要技巧: #jvtUS \
可滚动、更新的记录集 hR?{3d#x2
批量更新 Mq156TL
事务处理 hn
GZ=
e'NJnPO
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 m e$Z~/Akm
1、取得数据库连接 AlaW=leTe
1)用DriverManager取数据库连接 5{X<y#vAC0
例子 {UI+$/v#
String className,url,uid,pwd; N)X3XTY
className = "oracle.jdbc.driver.OracleDriver"; xef% d
G.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; g
wRZ%.Cn
uid = "system"; reu*53r]
pwd = "manager"; Q~
w|#
Class.forName(className); 0
1rK8jX
Connection cn = DriverManager.getConnection(url,uid,pwd); Q->sV$^=T
2)用jndi(java的命名和目录服务)方式 i>`%TW:g
例子 Naf0)3q>!
String jndi = "jdbc/db"; v0{i0%d,?
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); W:2( .?
DataSource ds = (DataSource) ctx.lookup(jndi); kiaw4_
Connection cn = ds.getConnection(); Ty?cC**
多用于jsp中 q6luUx,@m
2、执行sql语句 *Hn8)x}E
1)用Statement来执行sql语句 kS);xA8s]
String sql; D#C~pdp
Statement sm = cn.createStatement(); $bR~+C
sm.executeQuery(sql); // 执行数据查询语句(select) eu-*?]&Di
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); [q[Y~1o/&H
2)用PreparedStatement来执行sql语句 P/eeC"
String sql; }j)e6>K])
sql = "insert into user (id,name) values (?,?)"; 97*p+T<yp
PreparedStatement ps = cn.prepareStatement(sql); &DX! f
ps.setInt(1,xxx); A |4[vz9>H
ps.setString(2,xxx); <)H9V-5aZ
... ""G'rN_=Bi
ResultSet rs = ps.executeQuery(); // 查询 .uZ3odMlx
int c = ps.executeUpdate(); // 更新 :P~6~
Kum
4xje$/_d
3、处理执行结果 B~ GbF*j
查询语句,返回记录集ResultSet M5X&}cN6
更新语句,返回数字,表示该更新影响的记录数 %ntRG!
ResultSet的方法 /$?}YL,
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Xl#ggub?
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 A?P_DA
G9cUD[GB
4、释放连接 IOmfF[
cn.close(); ]h+j)J}[A
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection qR8Lh( "i
FcU SE
可滚动、更新的记录集 uw_Y\F-$
1、创建可滚动、更新的Statement R&k<AZ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \ Gvm9M
该Statement取得的ResultSet就是可滚动的 8Fu(Ft^9
2、创建PreparedStatement时指定参数 .Yn_*L+4*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); eq;uO6[
ResultSet.absolute(9000); Bj;'qB>3
批量更新 {4Cmu;u
1、Statement 583|blL
Statement sm = cn.createStatement(); '-~~-}= sJ
sm.addBatch(sql1); 1>h]{%I
sm.addBatch(sql2); ;4|15S
... <\^8fn
sm.executeBatch() f2`2,?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 VY4yS*y
2、PreparedStatement sDlO#
PreparedStatement ps = cn.preparedStatement(sql); aEeodA<(
{ Z@!+v19^
ps.setXXX(1,xxx); e*NnVys
... x'<X!gw
ps.addBatch(); +ye3HGD
} b3,
_(;A!
ps.executeBatch(); H*CW1([
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @*((1(q
9rf)gU3{+L
事务的处理 8<Av@9 *}
1、关闭Connection的自动提交 )Ql%r?(F+
cn.setAutoCommit(false); Vt#.eL)Ee
2、执行一系列sql语句 e(t\g^X
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @:#eb1<S
Statement sm ; p<"m[Dt]
sm = cn.createStatement(insert into user...); zQd
2
sm.executeUpdate(); )+DmOsH
sm.close(); 8{sGNCvU
sm = cn.createStatement("insert into corp...); x7[BK_SY
sm.executeUpdate(); #@Jq~$N|
sm.close(); Ad_hKO
3、提交 %Q|Atgp
cn.commit(); zK@@p+n_#.
4、如果发生异常,那么回滚 H G^'I+Yn
cn.rollback();