java 数据库基本操作 .4!N#'
1、java数据库操作基本流程 R|+R4'
2、几个常用的重要技巧: Lf 0Hz")
可滚动、更新的记录集 y-n\;d>[(
批量更新 DJQ]NY|
事务处理 29sgi"
)1fQhdO}x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接
kw-/h+lG
1、取得数据库连接 Rc6
)v
1)用DriverManager取数据库连接 BE"nyTQ
例子 k) v[/#I
String className,url,uid,pwd; eF8`an5S
className = "oracle.jdbc.driver.OracleDriver"; 8nnkv,wa
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; M?cKt.t
uid = "system"; K%=n \Y
pwd = "manager"; }=;>T)QmMO
Class.forName(className); R\.huOJh
Connection cn = DriverManager.getConnection(url,uid,pwd); doR'=@ W
2)用jndi(java的命名和目录服务)方式 (v4
例子 mLkZ4OZ
String jndi = "jdbc/db"; z)VIbEy
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); "]_|c\98
DataSource ds = (DataSource) ctx.lookup(jndi); -/gS s<"
Connection cn = ds.getConnection(); "DlCvjc
多用于jsp中 @eTsS%f2
2、执行sql语句 Ar<OP'C
1)用Statement来执行sql语句 6ZG)`u".("
String sql; owMH
Statement sm = cn.createStatement(); @6j*XF
sm.executeQuery(sql); // 执行数据查询语句(select) #>v7"
<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); pz&=5F
2)用PreparedStatement来执行sql语句 jujx3rnK?
String sql; D} .t
sql = "insert into user (id,name) values (?,?)"; 3-mw-;.
PreparedStatement ps = cn.prepareStatement(sql); +1)C&:
ps.setInt(1,xxx); 9>i6oF]Oq
ps.setString(2,xxx); f<w*l<@
... VNYLps@4H
ResultSet rs = ps.executeQuery(); // 查询 <Y#R]gf1
int c = ps.executeUpdate(); // 更新 !GIsmqVY
HQ
s)T
3、处理执行结果 Z@[,"{Sn
查询语句,返回记录集ResultSet :>X7(&j8
更新语句,返回数字,表示该更新影响的记录数 I
}/Oi]jA6
ResultSet的方法 li%-9Jd
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &16bZw
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 MtYP3:
5pok%g
4、释放连接 *[SsvlFt
cn.close(); `5 6QX'?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection )2FO+_K?T
tH'VV-!MZ
可滚动、更新的记录集 vR)7qX}
1、创建可滚动、更新的Statement 6fV)8,F3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); '!2t9B8XX
该Statement取得的ResultSet就是可滚动的 NdNfai
2、创建PreparedStatement时指定参数 %7d"()L
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); N/%#GfXx
ResultSet.absolute(9000); (t]>=p%4g
批量更新 wi9|
1、Statement Q
jBCkx]g
Statement sm = cn.createStatement(); Yjl0Pz.q
sm.addBatch(sql1); }-L@AC/\#
sm.addBatch(sql2); 5{g9Wh[
... d_,tXV"z&
sm.executeBatch() m@,>d_|-K-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g\-3c=X
2、PreparedStatement S!q}Pn
PreparedStatement ps = cn.preparedStatement(sql); Lq [wabF
{ %8*d)AB:
ps.setXXX(1,xxx); `e9uSF:9C
... ;:|KfXiC8
ps.addBatch(); $McO'Bye{h
} 'i(p@m<'
ps.executeBatch(); Q'a N|^w"f
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 1ZL_;k
+wUhB\F
*
事务的处理 Dgm%Ng
1、关闭Connection的自动提交 84!4Vz^
cn.setAutoCommit(false); SNU
bY6
2、执行一系列sql语句 H n!vTB
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close h(8;7}K
Statement sm ; z`5I1#PVA
sm = cn.createStatement(insert into user...); Ozv.;}SE
sm.executeUpdate(); vs@:L)GW\
sm.close(); 7:L~n(QpP
sm = cn.createStatement("insert into corp...); 668bJ.M\O
sm.executeUpdate(); c_q+_$t
sm.close(); 0X?fDz}jd
3、提交 B<XPu=|
cn.commit(); 3b3cNYP
4、如果发生异常,那么回滚 E)hinH
cn.rollback();