java 数据库基本操作 8957$g
1、java数据库操作基本流程 `[CJtd2\
2、几个常用的重要技巧: E'8Bw7Tz
可滚动、更新的记录集 Wwha?W>
批量更新 }D+8K
事务处理 ;%<4U^2
Ol[gck|~
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ea0tx3'
1、取得数据库连接 A.O~'')X
1)用DriverManager取数据库连接 cloI 6%5r
例子 YkPt*?,P/
String className,url,uid,pwd; 836m5/kH[
className = "oracle.jdbc.driver.OracleDriver"; a`*WpP \+
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !@{[I:5
uid = "system"; L@r.R_*H?s
pwd = "manager"; GuWBl$|+b
Class.forName(className); @3 c#\jx
Connection cn = DriverManager.getConnection(url,uid,pwd); j*4S] !
2)用jndi(java的命名和目录服务)方式 |vz;bJG
例子 Z!reX6
String jndi = "jdbc/db"; ZPao*2xz
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); g{hA,-3
DataSource ds = (DataSource) ctx.lookup(jndi); )`mF.87b&h
Connection cn = ds.getConnection(); 8
-;ZPhN&
多用于jsp中 ~iZF~PQ1_
2、执行sql语句 *^6xt7
1)用Statement来执行sql语句 *hs<Ez.cC
String sql; ~4MjJKzA
Statement sm = cn.createStatement(); OeGuq.>w
sm.executeQuery(sql); // 执行数据查询语句(select) ukf\*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2gAdZE&Y
2)用PreparedStatement来执行sql语句 tcEf
~|3
String sql; JK"uj%
sql = "insert into user (id,name) values (?,?)"; /kU@S
PreparedStatement ps = cn.prepareStatement(sql); *u'`XRJU/
ps.setInt(1,xxx); ]wpYxos
ps.setString(2,xxx); OIty
]c
... L"7`
\4
ResultSet rs = ps.executeQuery(); // 查询 a=.db&;vY
int c = ps.executeUpdate(); // 更新 8M+F!1-#
xKST-:c +
3、处理执行结果 *9Js:z7I
查询语句,返回记录集ResultSet 1r&
?J.z25
更新语句,返回数字,表示该更新影响的记录数 !9 LAXM
ResultSet的方法 -^Km}9g
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,
)pt_"-XA
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 50bP&dj&
y'|W['
4、释放连接 b%f2"e0g
cn.close(); ":#x\;
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection sk6|_
*2
$m>N
可滚动、更新的记录集 SA
4je9H%
1、创建可滚动、更新的Statement Po!JgcJ#\
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;:\,x
该Statement取得的ResultSet就是可滚动的 3KFrVhB=
2、创建PreparedStatement时指定参数 OGi4m |
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); V'f5-E0
ResultSet.absolute(9000); #u5;utY:F
批量更新 ?Wz(f {Hm
1、Statement 'A(-MTd%
Statement sm = cn.createStatement(); h9w^7MbO
sm.addBatch(sql1); 5`'au61/2
sm.addBatch(sql2); 2]RH)W86;
... ~uZLe\>K
sm.executeBatch() \]#;!6ge
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _B7?C:8Q-
2、PreparedStatement 7U
)qC}(
PreparedStatement ps = cn.preparedStatement(sql); xKLcd+hCZ
{ |XA aKZA
ps.setXXX(1,xxx); hOL y*%
... _KhEwd
ps.addBatch(); vua1iN1
} [(P[qEY
ps.executeBatch(); lyH X#]
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 h-+a;![
9Glfi@.
事务的处理 grfdvN
1、关闭Connection的自动提交 M3;v3
}z<-
cn.setAutoCommit(false); q{Ta?|x#
2、执行一系列sql语句 2:HP5
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close z0Z\d
Statement sm ; qTa]th;
sm = cn.createStatement(insert into user...); (zro7gKked
sm.executeUpdate(); OG?j6qhpl
sm.close(); zmfRZ!Eh
sm = cn.createStatement("insert into corp...); 5nM9!A\D
sm.executeUpdate(); b}?@syy8
sm.close(); $h]Y<&('G
3、提交 L1!hF3G
cn.commit(); "K$ Wh1<7
4、如果发生异常,那么回滚 -G<2R"Q#N
cn.rollback();