java 数据库基本操作 -r!. 9q
1、java数据库操作基本流程 .fn\]rUv
2、几个常用的重要技巧: xn?a. 3b'
可滚动、更新的记录集 9-sw!tKx
批量更新 gx-2v|pZ
事务处理 AL[KpY
Tg7an&#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 FX;QG94!
1、取得数据库连接 O5!7'RZ
1)用DriverManager取数据库连接 _;W.q7b]
例子 3_C|z,\:
String className,url,uid,pwd; pXtl
6K%
className = "oracle.jdbc.driver.OracleDriver"; ^Xz@`_I
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ?#Ge.D~u
uid = "system"; x" 7H5<
pwd = "manager"; |a8iZ9/D6
Class.forName(className); B=U 3
Connection cn = DriverManager.getConnection(url,uid,pwd); y3vdUauOn
2)用jndi(java的命名和目录服务)方式 dR
K?~1
例子 bes<qy
String jndi = "jdbc/db"; Zj_b>O-V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); # ' =a=8-$
DataSource ds = (DataSource) ctx.lookup(jndi); jY&k
Connection cn = ds.getConnection(); uY0lR:|
多用于jsp中 T!uM+6|Y
2、执行sql语句 QER?i;-wb
1)用Statement来执行sql语句 H
h4WMZJG
String sql; at @G/?
Statement sm = cn.createStatement(); *$#W]bO
sm.executeQuery(sql); // 执行数据查询语句(select) Upx G@b
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); O],T,Z?z
2)用PreparedStatement来执行sql语句 LhN|1f:9:
String sql; wDw[RW3
sql = "insert into user (id,name) values (?,?)"; b jy Zk_\
PreparedStatement ps = cn.prepareStatement(sql); GL&y@6
ps.setInt(1,xxx); K:J3Z5"
ps.setString(2,xxx); QZ!Y2Bz(4
... 6=kEyJT'
ResultSet rs = ps.executeQuery(); // 查询 L]yS[UN$
int c = ps.executeUpdate(); // 更新 {GvJZ!,RCg
1v#%Ei$6`t
3、处理执行结果 7 G)ZN{'
查询语句,返回记录集ResultSet G3txj
更新语句,返回数字,表示该更新影响的记录数 }#3V+X
ResultSet的方法 B)$| vK=
1、next(),将游标往后移动一行,如果成功返回true;否则返回false S&e0u%8mc
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 !H#bJTXB
O3;u G.:1
4、释放连接 ky8_UnaO
cn.close(); *F WMn.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [m+2(I1
iyN:%ofh
可滚动、更新的记录集 'Jiw@t<o3`
1、创建可滚动、更新的Statement 9y6-/H
,
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,y1PbA0m
该Statement取得的ResultSet就是可滚动的 #
q~e^A
b
2、创建PreparedStatement时指定参数 xg30xC[
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Gw=B:kGk
ResultSet.absolute(9000); ?yZ+D z\
批量更新 j 7fL7:,T
1、Statement $yN{-T"
Statement sm = cn.createStatement(); K'55O&2
sm.addBatch(sql1); #:jHp44J
sm.addBatch(sql2); V4hiGO[
... Fiv3 {.
sm.executeBatch() ,ZaRy$?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 {SOr#{1z*
2、PreparedStatement <5d~P/,
PreparedStatement ps = cn.preparedStatement(sql); GC<l#3+
{ XND|h#i8
ps.setXXX(1,xxx); SII;n2[Ze
... r`=+ L-!
ps.addBatch(); s kvGU(G}
} \@Ts+7%
ps.executeBatch(); b`(}.r?W
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 -] LY,M
9eR-
事务的处理 *jLJcb*.Ap
1、关闭Connection的自动提交 tI]Q%S,
cn.setAutoCommit(false); RW|`nL
2、执行一系列sql语句 9"NF/)_
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close yZ
@"\Z!
Statement sm ; m];]7uB5=
sm = cn.createStatement(insert into user...); 26e]`]!SU
sm.executeUpdate(); i=ea
?eT`
sm.close(); {mm)ay|M
sm = cn.createStatement("insert into corp...); Bz^jw>1b
sm.executeUpdate(); 5:\},n+VE
sm.close(); 67VL@ ]
3、提交 # Nk;4:[
cn.commit(); *7:>EP
4、如果发生异常,那么回滚 Nc1"g1JR
cn.rollback();