java 数据库基本操作 ^S2}0Nf
1、java数据库操作基本流程 Px&Mi:4tG
2、几个常用的重要技巧: b>._ r&.
可滚动、更新的记录集 G"sc;nT
批量更新 ~mo`
事务处理 _JO @O^Ndd
X1D:{S[
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 w.-i !Ls
1、取得数据库连接 /UyE- "S
1)用DriverManager取数据库连接 SP1oBR"3
例子 N|L5Ru
String className,url,uid,pwd; ,IATJs$E
className = "oracle.jdbc.driver.OracleDriver"; hd%F7D5
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; T5+b{qA
uid = "system"; Ap9wH[H
pwd = "manager"; hrt-<7U
Class.forName(className); u#|Jl|aT
Connection cn = DriverManager.getConnection(url,uid,pwd); _Hj,;Z
2)用jndi(java的命名和目录服务)方式 Oip..f0
例子 %=eD)p7l-
String jndi = "jdbc/db"; 3iL&;D
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); iiB$<b.((I
DataSource ds = (DataSource) ctx.lookup(jndi); rWmi 'niu
Connection cn = ds.getConnection(); M_I\:Q
多用于jsp中 K%Ml2V
2、执行sql语句 g<3>7&^
1)用Statement来执行sql语句 kO"aE~
String sql; 7^X_tQf
Statement sm = cn.createStatement(); "!?Ya{
sm.executeQuery(sql); // 执行数据查询语句(select) Nuq/_x
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); XL9lB#v^
2)用PreparedStatement来执行sql语句 a8$pc>2E
String sql; 7J/3O[2
sql = "insert into user (id,name) values (?,?)"; A*;h}\n
PreparedStatement ps = cn.prepareStatement(sql); mq9&To!
ps.setInt(1,xxx); V@f#/"u'
ps.setString(2,xxx); P .( X]+
... [} 3Y1t{G
ResultSet rs = ps.executeQuery(); // 查询 .1}(Bywm5
int c = ps.executeUpdate(); // 更新 ghiElsBU
7|Y8^T
s
3、处理执行结果 t/(j8w
查询语句,返回记录集ResultSet )}5rs
更新语句,返回数字,表示该更新影响的记录数 b=EZtk6>
ResultSet的方法 9Ua@-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false /% 1lJD
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 mJT
m/C
8=uljn/
4、释放连接 0[Aa2H*
cn.close(); h 42?^mV4?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ;Yj&7k1
<0}'#9>O
可滚动、更新的记录集 z0Hh8*
1、创建可滚动、更新的Statement 0l*/_;wo
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); MLX.MUS
该Statement取得的ResultSet就是可滚动的 K.Z{4x=0
2、创建PreparedStatement时指定参数 VUy
1?n
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
7]bqs"t
ResultSet.absolute(9000); 0T;WN$W|
批量更新 &Y$rVBgQ
1、Statement dI|/Xm>
Statement sm = cn.createStatement(); d0az#Yg!
sm.addBatch(sql1); AQZ\Kcr
sm.addBatch(sql2); } q(0uzaG
... =QRZ(2Wq
sm.executeBatch() ZS]e}]Zwp
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ESI}+
2、PreparedStatement D%v yO_k
PreparedStatement ps = cn.preparedStatement(sql); ,;y^|X
{ o 8U2vMH
ps.setXXX(1,xxx); 'Ud5;?{
... zFIKB9NUn
ps.addBatch(); ]=Q'1%
} 0kfw8Lon
ps.executeBatch(); [U0c
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 9mZ1 a6,x
f[D#QC
事务的处理 nceF4Ty
1、关闭Connection的自动提交 t60m:k4J
cn.setAutoCommit(false); ?hYe4tc-#
2、执行一系列sql语句 :QNEA3Q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &$[{L)D
Statement sm ; P@#6.Bb#V
sm = cn.createStatement(insert into user...); E3qX$|.$/
sm.executeUpdate(); ~MX@-Ff
sm.close(); ^y,ip=<5\3
sm = cn.createStatement("insert into corp...); 3ssio-X
sm.executeUpdate(); p"Y=
sm.close(); H Vy^^$
3、提交 0a5P@;"a
cn.commit(); '`u1,h
4、如果发生异常,那么回滚 kcb'`<B
cn.rollback();