java 数据库基本操作 D"IxQ2}k
1、java数据库操作基本流程 Ou+b ce
2、几个常用的重要技巧: i*T
-9IP
可滚动、更新的记录集 AN)r(86L
批量更新 u>*qDr*d
事务处理 Rt@O@oD I
` ^;J<l
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 I]WvcDJ}C
1、取得数据库连接 27}0
1)用DriverManager取数据库连接 XI,= W
例子 CQ7NQ^3k
String className,url,uid,pwd; 6lUC$B Y
className = "oracle.jdbc.driver.OracleDriver"; 7/)0{B4U'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =JxEM7r
uid = "system"; Z=]ujlD
pwd = "manager"; ;
FHnu|
Class.forName(className); 0#~k)>(7lR
Connection cn = DriverManager.getConnection(url,uid,pwd); ;(Az
2)用jndi(java的命名和目录服务)方式 1E0!?kRK
例子 3jHE,5m
String jndi = "jdbc/db"; 7W>(T8K X\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); G?Za/G
DataSource ds = (DataSource) ctx.lookup(jndi); w zi7pJjXh
Connection cn = ds.getConnection(); |+qsO;
多用于jsp中 !=u=P9I
2、执行sql语句 R^"mGe\LL
1)用Statement来执行sql语句 $Z8riVJ7j-
String sql; 4E+8kz'
Statement sm = cn.createStatement(); Emw]`
sm.executeQuery(sql); // 执行数据查询语句(select) d<w]>T5VW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); gu&W:FY
2)用PreparedStatement来执行sql语句 Q
/t_%vb
String sql; }]^/`n
sql = "insert into user (id,name) values (?,?)"; ;jBS:k?
PreparedStatement ps = cn.prepareStatement(sql); Q`Rn,kCVy
ps.setInt(1,xxx); C
u1G8t-
ps.setString(2,xxx); uG-S$n"7K
... CY$
1;/
ResultSet rs = ps.executeQuery(); // 查询 D$E#:[
int c = ps.executeUpdate(); // 更新 7\gu; [n
o'8%5M@
3、处理执行结果 }rF4M1+B\
查询语句,返回记录集ResultSet TV`sqKW
更新语句,返回数字,表示该更新影响的记录数 ^oNcZK>
ResultSet的方法 Fl}!3k>c
1、next(),将游标往后移动一行,如果成功返回true;否则返回false i`?yi-R&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 \[%_ :9eq
_joW%`T8
4、释放连接 Y=y
0`?K
cn.close(); G3h"Eo?>g
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection p(9[*0.};
XV,ce~ro[
可滚动、更新的记录集 IYa(B+nB)
1、创建可滚动、更新的Statement A=70UL
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); dJlK'zK
该Statement取得的ResultSet就是可滚动的 U8@P/Z9
2、创建PreparedStatement时指定参数 MPF({Pnx7
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); x6^FpNgQ
ResultSet.absolute(9000); 9#kk5 )J
批量更新 O'QnfpQ*9
1、Statement ,fo7.
h4{
Statement sm = cn.createStatement(); PF+Or
sm.addBatch(sql1); 9D;ono3
sm.addBatch(sql2); [w)KNl
... Qh*}v!3Jo
sm.executeBatch()
YdUcO.V
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 c5pK%I }O
2、PreparedStatement 5'%O]~
PreparedStatement ps = cn.preparedStatement(sql); J/PK#<
{ '{cFr
ps.setXXX(1,xxx); Hr T@Df
... u`Kc\BSn
ps.addBatch(); 9E|QPT
} :^FH.6}x
ps.executeBatch(); 5r dt
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 bL{D*\HF
1[-`*Ph
事务的处理 @g*[}`8]y
1、关闭Connection的自动提交 q;_?e_
cn.setAutoCommit(false); ++ObsWZ
2、执行一系列sql语句 @X=sfygk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close u#Bj#y!
Statement sm ; ]I]G3 e
sm = cn.createStatement(insert into user...); CZ%KC$l.5
sm.executeUpdate(); uLNOhgSUf
sm.close(); +?{LLD*2e
sm = cn.createStatement("insert into corp...); /AYq^
sm.executeUpdate(); K<WowU
sm.close(); ,mz7!c9H^a
3、提交 "hZ `^"0b
cn.commit(); ~{N#JOY}Z
4、如果发生异常,那么回滚 z]=Ks_7
cn.rollback();