java 数据库基本操作 X 5
or5v
1、java数据库操作基本流程 s_fe4K
2、几个常用的重要技巧: @!!u>1
可滚动、更新的记录集 2672oFD
批量更新 ,iP
YsW]5
事务处理 ~B"HI+:\L
&DGz/o
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 x}c
1、取得数据库连接 .-tR <{
g
1)用DriverManager取数据库连接 {fHor
例子 !s1<)%Jt
String className,url,uid,pwd; Qr~!YPK\
className = "oracle.jdbc.driver.OracleDriver"; qwj7CIc(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; r1<*=Fs=>>
uid = "system"; &Y=~j?~Xm
pwd = "manager"; ^$lZ
Class.forName(className); $u~ui@kB
Connection cn = DriverManager.getConnection(url,uid,pwd); Q> y!
2)用jndi(java的命名和目录服务)方式 _1G/qHf^S
例子 &k}B66
String jndi = "jdbc/db"; >(igVaZ>
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
S 4
17.n
DataSource ds = (DataSource) ctx.lookup(jndi); U~7udUR
Connection cn = ds.getConnection(); L@AFt)U
多用于jsp中 J.4U;A5
2、执行sql语句 ]9/A=p?J@
1)用Statement来执行sql语句 }l$zZ>.\H
String sql; r.#r!.6 q
Statement sm = cn.createStatement(); r1%{\<
sm.executeQuery(sql); // 执行数据查询语句(select) %?gG-R
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); a"U3h[;$y
2)用PreparedStatement来执行sql语句 2h51zG#qd
String sql; 16 `M=R
sql = "insert into user (id,name) values (?,?)"; |au`ph5
PreparedStatement ps = cn.prepareStatement(sql); 2 >O [Y1
ps.setInt(1,xxx); |LQ%sV
ps.setString(2,xxx); {*GBUv5
... _h}(jEd!
ResultSet rs = ps.executeQuery(); // 查询 *m<[ sS
int c = ps.executeUpdate(); // 更新 U; m@
p+]S)K GZw
3、处理执行结果 ANw1P{9*
查询语句,返回记录集ResultSet Q2m[XcnX
更新语句,返回数字,表示该更新影响的记录数 m6BUKX\m
ResultSet的方法 Ii[U%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;u'VR}4ph
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 MW rhVn{R
kGAgXtE
4、释放连接 -%fj-Y7y
cn.close(); ]ASw%Lw)
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection zMP6hn
W1"NKg~4
可滚动、更新的记录集 v {HF}L
1、创建可滚动、更新的Statement CS~onf<xz
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); =Vs?=|r
该Statement取得的ResultSet就是可滚动的 PA,aYg0f
2、创建PreparedStatement时指定参数 m-Jy
4f#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); `Ze$Bd\
ResultSet.absolute(9000); JX5/PCO
批量更新 Y(7&3+'K
1、Statement @~ke=w6&pe
Statement sm = cn.createStatement(); v%*don
sm.addBatch(sql1); ]`x+wWe
sm.addBatch(sql2); q`2dL)E
... ">wvd*w0"(
sm.executeBatch() e7xv~C>g
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 (!{*@?S
2、PreparedStatement t.;._'
PreparedStatement ps = cn.preparedStatement(sql); TM#L.xPMf
{ 2H9hN4N
ps.setXXX(1,xxx); d<j`=QH
... Wgte.K> /
ps.addBatch(); ?o+%ckH
} PsNrCe%e
ps.executeBatch(); COHBjufmR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 tUULpx.h
hizM}d-"C
事务的处理 ?y>ji1
1、关闭Connection的自动提交 '1b8>L
cn.setAutoCommit(false); Bcv{Y\x;ko
2、执行一系列sql语句
AjcKz
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close nn:'<6"oV
Statement sm ; dX1jn;7
sm = cn.createStatement(insert into user...); SceHdx(]
sm.executeUpdate(); $)ka1L"N
sm.close(); I[K4/91
sm = cn.createStatement("insert into corp...); AH'c:w]~
sm.executeUpdate(); !zOj`lx
sm.close(); fWEQ vQ
3、提交 M("sekL
cn.commit(); w#A\(z%;x
4、如果发生异常,那么回滚 i,;eW&
cn.rollback();