java 数据库基本操作 uY{|szC^2
1、java数据库操作基本流程 S~<$Hy*kh
2、几个常用的重要技巧: O24m;oHM
可滚动、更新的记录集 99]R$eT8
批量更新 'HO$C,1]
事务处理 kF3k7,.8&
# ncRb
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 l.(v^3:X
1、取得数据库连接 *o]L|Vu
1)用DriverManager取数据库连接 >;jZa
例子 3(``#7
String className,url,uid,pwd; `b?R#:G
className = "oracle.jdbc.driver.OracleDriver"; Av$]|b
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; [ieI;OG;
uid = "system"; 5v[*:0p'
pwd = "manager"; ajve~8/&
Class.forName(className); :)8VdWg
Connection cn = DriverManager.getConnection(url,uid,pwd); _aq8@E~
2)用jndi(java的命名和目录服务)方式 Vo4,@scG
例子 j SHk{T!J
String jndi = "jdbc/db"; .L+6 $8m
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /hpY f]t
DataSource ds = (DataSource) ctx.lookup(jndi); x" 7H5<
Connection cn = ds.getConnection(); |a8iZ9/D6
多用于jsp中 B=U 3
2、执行sql语句 y3vdUauOn
1)用Statement来执行sql语句 ov|d^)'
String sql; {5A2&
Statement sm = cn.createStatement(); J.3u^~zy
sm.executeQuery(sql); // 执行数据查询语句(select) LmRy1T,act
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Dxtp2wu%t
2)用PreparedStatement来执行sql语句 S};#+ufgTt
String sql; SbcS]H5Sk
sql = "insert into user (id,name) values (?,?)"; Ih@61>X.o*
PreparedStatement ps = cn.prepareStatement(sql); !d'GE`w T
ps.setInt(1,xxx); D,FHZDt
ps.setString(2,xxx); 2Zm0qJ
... 87=&^.~`
ResultSet rs = ps.executeQuery(); // 查询 +|*IZ:w)
int c = ps.executeUpdate(); // 更新 <:_wbVn-
1kz\IQ{
3、处理执行结果 ,t3wp#E2#
查询语句,返回记录集ResultSet G%BjhpL
更新语句,返回数字,表示该更新影响的记录数 b jy Zk_\
ResultSet的方法 GL&y@6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false K:J3Z5"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 5b5x!do
|Yx~;q:
4、释放连接 -Mip,EO
cn.close(); P=qa::A
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >3ZFzh&OYQ
CZ8KEBl
可滚动、更新的记录集 rDl*d`He!
1、创建可滚动、更新的Statement ]{!U@b
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); eFipIn)b
该Statement取得的ResultSet就是可滚动的 '|ad_M
2、创建PreparedStatement时指定参数 y~(h>gi,x
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); .n TwPrG
ResultSet.absolute(9000); i|c'Lbre`
批量更新 U1Q:= yD
1、Statement Yy5h"r
Statement sm = cn.createStatement(); }~2LW" 1'
sm.addBatch(sql1); K)6rY(x
>
sm.addBatch(sql2); :X"?kK0 V
... v0ujdp,B
sm.executeBatch() vx\r!]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ih)zG
2、PreparedStatement xg30xC[
PreparedStatement ps = cn.preparedStatement(sql); Gw=B:kGk
{ zy?.u.4L
ps.setXXX(1,xxx); \$R_YKGf1G
... #:jHp44J
ps.addBatch(); ><RpEnWZ<
} G, 44va
ps.executeBatch(); p5Z"|\
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~3^
8>d/
YD<:,|H
事务的处理 Moy <@+
1、关闭Connection的自动提交 Q}`0W[a
~
cn.setAutoCommit(false); @>u}eB>Kn
2、执行一系列sql语句 ,NOsFO-`<
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~Io7]
Statement sm ; D!@Ciw
sm = cn.createStatement(insert into user...); Yf:IKY
sm.executeUpdate(); 5c9^-|-T
sm.close(); ^"2i
sm = cn.createStatement("insert into corp...); ~Uu4=
sm.executeUpdate(); ?:pP8/y
sm.close(); ~Uj=^leYO
3、提交 ;m0~L=w
cn.commit(); 2SD`OABf#
4、如果发生异常,那么回滚 Ut*`:]la
cn.rollback();