java 数据库基本操作 "fwuvT
1
1、java数据库操作基本流程 EaL+}/q&
2、几个常用的重要技巧: u^9,u/gj
可滚动、更新的记录集 7MfvU|D[d/
批量更新 Jl}7]cVq#
事务处理 ~=Sr0+vV
;T(^riAEl
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 b`=rd 4cpU
1、取得数据库连接 9bvd1bKEW
1)用DriverManager取数据库连接 Kep?=9r4+
例子 ?whp_
String className,url,uid,pwd; O^hV<+CX
className = "oracle.jdbc.driver.OracleDriver"; ]e9kf$'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; I}{eYXh
uid = "system"; 0U~JSmj:2K
pwd = "manager"; ]|(?i ,p
Class.forName(className); RUO6Co-
Connection cn = DriverManager.getConnection(url,uid,pwd); IS~oyFS
2)用jndi(java的命名和目录服务)方式 ^.7xu/T
例子 u[@*}|uXM
String jndi = "jdbc/db"; % *hBrjbj
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); B dUyI_Ks:
DataSource ds = (DataSource) ctx.lookup(jndi); 6<R
U~Gh
Connection cn = ds.getConnection(); &kt#p;/p?
多用于jsp中 Z
m>69gl
2、执行sql语句 1owoh,V6
1)用Statement来执行sql语句 6ZJQ '9f
String sql; &bNj/n/
Statement sm = cn.createStatement(); #/6X44
*u
sm.executeQuery(sql); // 执行数据查询语句(select) HC$cK+,ZU}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); C2T,1 =
2)用PreparedStatement来执行sql语句 >@o*v*25
String sql; T9 1Iz+j
sql = "insert into user (id,name) values (?,?)"; ^
T S\x/P
PreparedStatement ps = cn.prepareStatement(sql); MvA_tRO
ps.setInt(1,xxx); ~Fh(4'
ps.setString(2,xxx); vJ s/ett
... 7#`:m|$
ResultSet rs = ps.executeQuery(); // 查询 O5w\oDhMb
int c = ps.executeUpdate(); // 更新 *{bqHMd4L
7dRU7p>
3、处理执行结果 12E"6E)
查询语句,返回记录集ResultSet }K\_N]#6n
更新语句,返回数字,表示该更新影响的记录数 u-$AFSt
ResultSet的方法 IG\\RYr
1、next(),将游标往后移动一行,如果成功返回true;否则返回false /e,lD)
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Hqk2W*UTl
MmB-SR[>P
4、释放连接 BN67o]*]<
cn.close(); =v}.sJ V?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Lj#6K@u@Z
'S\H% -
可滚动、更新的记录集 'lF|F+8
1、创建可滚动、更新的Statement 6 s/O\A
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 3h>Ji1vV
该Statement取得的ResultSet就是可滚动的 /WMLr5
2、创建PreparedStatement时指定参数 +(
d2hSIF
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Phczf
ResultSet.absolute(9000); f.{0P-Np
批量更新 1*"Uc!7.%
1、Statement ueOvBFgZ
Statement sm = cn.createStatement(); &+sN=J.x
sm.addBatch(sql1); =G`m7!Q)
sm.addBatch(sql2); qi$8GX=~r
... !E8JpE|z#
sm.executeBatch() $}829<gh7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g|oPRC$I'
2、PreparedStatement 2t'&7>Ys{
PreparedStatement ps = cn.preparedStatement(sql); :>;#/<3{
{
J&?kezs
ps.setXXX(1,xxx); &nss[w$%C
... gVc[`(@h
ps.addBatch(); bP[/
} gDrqs>8
ps.executeBatch(); \]D;HR`vo
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 e-WaK0Ep
!}%giF$-
事务的处理 [
kknY+n1
1、关闭Connection的自动提交 {+ m)*3~w
cn.setAutoCommit(false); K:0RP?L
2、执行一系列sql语句 h0`)=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "T'!cy
Statement sm ; x+&&[>-P
sm = cn.createStatement(insert into user...); Jg:'gF]jt
sm.executeUpdate(); q&.!*rPD
sm.close(); xFJ>s-g*
sm = cn.createStatement("insert into corp...);
J' ;tpr
sm.executeUpdate();
>Y:ouN~<
sm.close(); mMR[(
3、提交 9D@Ez"xv
cn.commit(); Mm5l> D'c
4、如果发生异常,那么回滚 *VpQ("
cn.rollback();