java 数据库基本操作 0x &^{P~
1、java数据库操作基本流程 Wm,,OioK
2、几个常用的重要技巧: .=FJ5?:4i%
可滚动、更新的记录集 #Nd+X@j
批量更新 z7_./ksQ
事务处理 jl@8pO$
Fi`:G}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 z[rB/|2
1、取得数据库连接 o99 a=x6
1)用DriverManager取数据库连接 zKutx6=aj
例子 51,m^veO
String className,url,uid,pwd; Ii8jY_
className = "oracle.jdbc.driver.OracleDriver"; dkLR
Q
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *,pqpD>
uid = "system"; :h3JDQe:.
pwd = "manager"; x V e!
Class.forName(className); 6GN'rVr!Z
Connection cn = DriverManager.getConnection(url,uid,pwd); ;uDFd04w
[
2)用jndi(java的命名和目录服务)方式 +W1rm$Q
例子 c9[5)
String jndi = "jdbc/db"; oEN_,cUp
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); q ^gEA5
DataSource ds = (DataSource) ctx.lookup(jndi); W{h7+X]Y
Connection cn = ds.getConnection(); RW)C<g
多用于jsp中 L; ~=(
2、执行sql语句 pi{ahuI#_o
1)用Statement来执行sql语句 *Tlv'E.M
String sql; 72 6y/o
Statement sm = cn.createStatement(); f,#xicSB*
sm.executeQuery(sql); // 执行数据查询语句(select) E*l"uV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %'HUC>ChN
2)用PreparedStatement来执行sql语句 lrzW H0Q
String sql; 3{l"E(qqZ
sql = "insert into user (id,name) values (?,?)"; 7ou^wt+%
PreparedStatement ps = cn.prepareStatement(sql); iI1t
P
ps.setInt(1,xxx); Ame%:K!t
ps.setString(2,xxx); ^:j$p,0e*S
... b+hY^$//
ResultSet rs = ps.executeQuery(); // 查询 .<B1i
int c = ps.executeUpdate(); // 更新 hTm}j,H
-UVWs2W'$
3、处理执行结果 rUO{-R
查询语句,返回记录集ResultSet j$^]WRt
更新语句,返回数字,表示该更新影响的记录数 5ZVTI,4K
ResultSet的方法 k.ZfjX"
1、next(),将游标往后移动一行,如果成功返回true;否则返回false -{h[W bf
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 C0%%@
2+
?2TH("hV$
4、释放连接 ]@>|y2
cn.close(); kWd'gftQ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection t/Fe"T[,V
UU;:x"4
可滚动、更新的记录集 z#4g,)ZX
1、创建可滚动、更新的Statement 7'S]
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); =-qsz^^a-
该Statement取得的ResultSet就是可滚动的 v`&Z.9!Tz^
2、创建PreparedStatement时指定参数 kXr%73s
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); GpL#,q Yc
ResultSet.absolute(9000); ]`prDw'
批量更新 m
C Ge*V}
1、Statement 0 *\=Q$Yy
Statement sm = cn.createStatement(); @2gMtf?<
sm.addBatch(sql1); K5SO($
sm.addBatch(sql2); YSgF'qq\
... )VT/kIq-U
sm.executeBatch() {/<&
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 (=j!P*
2、PreparedStatement 3_$eQ`AAA
PreparedStatement ps = cn.preparedStatement(sql);
.D.Rn/
{ l5FQ!>IM
ps.setXXX(1,xxx); umzYJ>2t
... Pcs@`&}7r
ps.addBatch(); Q-v[O4y~
} R5"p7>
ps.executeBatch(); T8-$[
2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :3f2^(b~^
&}O!l'
事务的处理 jvQ"cs$.
1、关闭Connection的自动提交 }H=OVbQor
cn.setAutoCommit(false); (Y([^N q
2、执行一系列sql语句 } Kt?0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %5%Wo(W'
Statement sm ; 8:xo ~Vc
sm = cn.createStatement(insert into user...); YkX=n{^
sm.executeUpdate(); zwtsw [.
sm.close(); ]B4mm__
sm = cn.createStatement("insert into corp...); UD{/L"GG
sm.executeUpdate(); OX4D'
sm.close(); )*ckJK
3、提交 B! V{.p
cn.commit(); Q\L5ZJ%y/
4、如果发生异常,那么回滚 Br5Io=/wg
cn.rollback();