java 数据库基本操作 V %{9o
1、java数据库操作基本流程 6&OonYsP
2、几个常用的重要技巧: uc"[ qT(X
可滚动、更新的记录集 H z< M
批量更新
Skk3M?
事务处理 VvMU)
Tl/Dq(8JH
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 bb
O;AiHD
1、取得数据库连接 soQv?4
1)用DriverManager取数据库连接 !Lg}q!*%>V
例子 qG2\`+v
String className,url,uid,pwd; E3.W#=o
className = "oracle.jdbc.driver.OracleDriver"; e~2*>5\:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; V)?x*R*T)
uid = "system"; #:ED 0</
pwd = "manager"; m|Q&Lphb8
Class.forName(className); PE;0
jgsiI
Connection cn = DriverManager.getConnection(url,uid,pwd); qI V`zZc
2)用jndi(java的命名和目录服务)方式 2)I'5?I
例子 G.q^Zd#.T
String jndi = "jdbc/db"; Fb<\(#t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); p-(ADQS
DataSource ds = (DataSource) ctx.lookup(jndi); 9^Vx*KVrU
Connection cn = ds.getConnection(); w_z^5\u0
多用于jsp中 a,0o{*(u$
2、执行sql语句 ?w5nKpG#RI
1)用Statement来执行sql语句 @R-~zOv
String sql; )H37a
Statement sm = cn.createStatement(); z7l;|T
sm.executeQuery(sql); // 执行数据查询语句(select) .}hZ7>4-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); NM.f0{:cj
2)用PreparedStatement来执行sql语句 Kj<<&_B.H
String sql; n'ca*E(
sql = "insert into user (id,name) values (?,?)"; ->"h5h
PreparedStatement ps = cn.prepareStatement(sql); gU 2c--`
ps.setInt(1,xxx); ae(]9 VW
ps.setString(2,xxx); f@.Q%+!4
... kAQ\t?`x
ResultSet rs = ps.executeQuery(); // 查询 Vp-OGX[
int c = ps.executeUpdate(); // 更新 <2@<r
t{
<hF~L k ,
3、处理执行结果 @9kk
f{?
查询语句,返回记录集ResultSet 8Jy1=R*S
更新语句,返回数字,表示该更新影响的记录数 W!Ct[t
ResultSet的方法 y3o4%K8
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~NW5+M(u
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 [2j(\vC!
H R!>g
4、释放连接 koWb@V]
cn.close(); Y,pS/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Mb/6>
,LPFb6o
可滚动、更新的记录集 zH\;pmWiN9
1、创建可滚动、更新的Statement Xde=}9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); r;6YCI=z
该Statement取得的ResultSet就是可滚动的 JpHsQ8<
2、创建PreparedStatement时指定参数 j
BQqpFH9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); gZ=9Y:$
ResultSet.absolute(9000); C2,cyhr
批量更新 4[EO[x4C
1、Statement v%8-Al^G
Statement sm = cn.createStatement(); ThQEQ6y
sm.addBatch(sql1); Ynh4oWUp
sm.addBatch(sql2); {^19.F
... #y9K-}u
sm.executeBatch() ^[\53\R~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 fN%5D z-e
2、PreparedStatement *1$~CC7
PreparedStatement ps = cn.preparedStatement(sql); .L TFa.jxA
{ O>):^$-K%
ps.setXXX(1,xxx); #pn AK
... tIy/QN_42
ps.addBatch(); 2mp>Mn~K^
} bg3jo1J
ps.executeBatch(); 7R`ZTfD
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ORPl^n-
7u3b aM
事务的处理 ]A<u eM
1、关闭Connection的自动提交 AQNx%
cn.setAutoCommit(false); fD}]Mi:V
2、执行一系列sql语句 m=l3O:~J
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ]3#
@t:>
Statement sm ; kd4*Zab
sm = cn.createStatement(insert into user...); {|wTZ
sm.executeUpdate(); 9M~$W-5
sm.close(); iU+,Jeu
sm = cn.createStatement("insert into corp...); -Aym+N9
sm.executeUpdate(); 3\l9Sf=M|
sm.close(); A)a+LW'=u
3、提交 4Jy,IKPp
cn.commit(); j<-o{6r
4、如果发生异常,那么回滚 "N:]d*A\
cn.rollback();