java 数据库基本操作 @!O(%0
=
1、java数据库操作基本流程 nZ (wfNk
2、几个常用的重要技巧: >5"e<mwD7d
可滚动、更新的记录集 udIm}jRA"
批量更新 ^;.u}W
事务处理 \i@R5v=zL
=5V7212
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接
MI^$df
1、取得数据库连接 r<Cr)%z!
1)用DriverManager取数据库连接 o0S8ki
例子 %*wEzvt*
String className,url,uid,pwd; u/-EVCHr
y
className = "oracle.jdbc.driver.OracleDriver"; _nEVmz!zg
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; &zJ*afi)
uid = "system"; S<*IoZ?T
pwd = "manager"; ,Z _@]D@
Class.forName(className); "#-iD
Connection cn = DriverManager.getConnection(url,uid,pwd); + G[zE
2)用jndi(java的命名和目录服务)方式 |yzv o"3
例子 /h.{g0Xc
String jndi = "jdbc/db";
bZ OCj1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -1d*zySL
DataSource ds = (DataSource) ctx.lookup(jndi); T!>h Pg
Connection cn = ds.getConnection(); Dj'?12Onu=
多用于jsp中 A9u>bWIE7
2、执行sql语句 _~ei1
G.R
1)用Statement来执行sql语句 dv3u<X M~
String sql; VBF:MAA
Statement sm = cn.createStatement(); {;& U5<NO
sm.executeQuery(sql); // 执行数据查询语句(select) ~gGkw#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); }1~9i'o%Z
2)用PreparedStatement来执行sql语句 d;wq@e
String sql; js"5{w&
sql = "insert into user (id,name) values (?,?)"; /j4G}
PreparedStatement ps = cn.prepareStatement(sql); Mx`';z8~
ps.setInt(1,xxx); aX6}:"R2C
ps.setString(2,xxx); 6sQ;Z |!Pz
... >~Tn%u<
ResultSet rs = ps.executeQuery(); // 查询 z=g!mVK5
int c = ps.executeUpdate(); // 更新 #\n*Qg4p
>A6W^J|[
3、处理执行结果 lNyyLLt
查询语句,返回记录集ResultSet Ak('4j!*}^
更新语句,返回数字,表示该更新影响的记录数 [u2t1^#Ol
ResultSet的方法 CI$z+zN
1、next(),将游标往后移动一行,如果成功返回true;否则返回false /2c(6h
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9&.md,U '
C4.GtY8,d
4、释放连接 ~u2f`67{
cn.close(); n*na6rV\k
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
fDfph7[)
HiU)q
可滚动、更新的记录集 ~9vK6;0
1、创建可滚动、更新的Statement nGYimRYO
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); TNA7(<"fV|
该Statement取得的ResultSet就是可滚动的 qm:C1#<p
2、创建PreparedStatement时指定参数 lqJ92vi6Q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); yt5<J-m
ResultSet.absolute(9000); <!UnH6J.b
批量更新 kh2TDxa&
1、Statement <bSPKTKL
Statement sm = cn.createStatement(); J`GL_@$q
sm.addBatch(sql1); 4
l-UrnZ
sm.addBatch(sql2); Tq?Ai_
... ~wv$uL8y
sm.executeBatch() $L6R,%c
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 5V =mj+X?
2、PreparedStatement r~f;g9I
PreparedStatement ps = cn.preparedStatement(sql); n5.sx|bI?
{ xsJXf @
ps.setXXX(1,xxx); >c<xy>N
... 0:u:#))1
ps.addBatch(); =mZYBm,IQ
} 7Vh
ps.executeBatch(); w)@Wug
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 S\:+5}
6Q]c}
事务的处理 Z@&%"nO
1、关闭Connection的自动提交 tUc<ExvP,
cn.setAutoCommit(false); F!)[H["_
2、执行一系列sql语句 _0'X!1"
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !3k-' ),z&
Statement sm ; ]j6pd*H
sm = cn.createStatement(insert into user...); .<z7$lz\
sm.executeUpdate(); 2 (l0Lq*
sm.close(); "B
(?|r%
sm = cn.createStatement("insert into corp...); 3.BUWMD
sm.executeUpdate(); u^{p'a'
sm.close(); js <Up/1
3、提交 @_-,Q5
cn.commit(); -k8sR1(
4、如果发生异常,那么回滚 =d^hiR!GN
cn.rollback();