java 数据库基本操作 >:1P/U
1、java数据库操作基本流程 w$ fJ4+
2、几个常用的重要技巧: zpjqEEY;
可滚动、更新的记录集 {38bv.3'
批量更新 o{WyQ&2N
事务处理
F0lOlS
F]+~x/!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 j/!H$0PN
1、取得数据库连接 @n+=vC.xO
1)用DriverManager取数据库连接 ?cy4&]s
例子 Mps5Vv
String className,url,uid,pwd; =^;P#kX
className = "oracle.jdbc.driver.OracleDriver"; 5h{`<W
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +-$Ko fnM
uid = "system"; h6D^G5i
pwd = "manager"; 19UN*g3(
Class.forName(className); y1f:?L-z
Connection cn = DriverManager.getConnection(url,uid,pwd); 1;F`c`0<
2)用jndi(java的命名和目录服务)方式 vVxD!EL
例子 I]`-|Q E
String jndi = "jdbc/db"; gVR@&bi7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); v|';!p|
DataSource ds = (DataSource) ctx.lookup(jndi); qxOi>v0\H
Connection cn = ds.getConnection(); gl%`qf6:O
多用于jsp中 0JjUAxNq
2、执行sql语句 v6=-g$FG
1)用Statement来执行sql语句 j2 %^qL
String sql; \cJa;WM>
Statement sm = cn.createStatement(); PkuTg";
sm.executeQuery(sql); // 执行数据查询语句(select) EHf\L
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); `'S0*kMT
2)用PreparedStatement来执行sql语句 *%5{'
String sql; 2f~($}+*
sql = "insert into user (id,name) values (?,?)"; %;xOB^H^
PreparedStatement ps = cn.prepareStatement(sql); w3T ]H_V
ps.setInt(1,xxx); p{$p
$/A
ps.setString(2,xxx); F>hZ{
... +-?/e-z")
ResultSet rs = ps.executeQuery(); // 查询 yYZxLJ='
int c = ps.executeUpdate(); // 更新 A!i q->+
9ooY?J
3、处理执行结果 IH*s8tPc
查询语句,返回记录集ResultSet 2}U!:bn(
更新语句,返回数字,表示该更新影响的记录数 KzUlTl0
ResultSet的方法 muON>^MbC
1、next(),将游标往后移动一行,如果成功返回true;否则返回false GEUg]nw
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %/%UX{8R
0E`1HP"b
4、释放连接 5VW|fI
cn.close(); k?GD/$1t
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *iA4:EIP
;]2s,za)qs
可滚动、更新的记录集 V~IIYB7
1、创建可滚动、更新的Statement f9$xk|2g
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +j14Q$
该Statement取得的ResultSet就是可滚动的 l! bv^
2、创建PreparedStatement时指定参数 pKG<Nvgz&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (5L-G{4
ResultSet.absolute(9000); kS5_
批量更新 s@4nWe
1、Statement B=f,QU
Statement sm = cn.createStatement(); ~Ou1WnmO
sm.addBatch(sql1); x Gk6n4Gg
sm.addBatch(sql2); o+B:#@9?
... O*6n$dUj3
sm.executeBatch() 1 T<+d5[C
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 I{'f|+1
2、PreparedStatement `_ %S
PreparedStatement ps = cn.preparedStatement(sql); HeGYu?&
{ 6?tlU>A2s
ps.setXXX(1,xxx); 68fiG
... CTa#Q,
ps.addBatch(); .wA+S8}S
} E>LkJSy=
ps.executeBatch(); 5Z/7kU=I
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 T4/fdORS
w'4AJ Q|;
事务的处理 :nN1e
1、关闭Connection的自动提交 W*DVi_\$y
cn.setAutoCommit(false); CBYX]
2、执行一系列sql语句 PQmq5N6
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $lA
V 6I.
Statement sm ; h"mi"H^o
sm = cn.createStatement(insert into user...); VXBY8;+Yp
sm.executeUpdate(); pO Iq%0]
sm.close(); eDI=nSo
sm = cn.createStatement("insert into corp...); 8LkP)]4^sO
sm.executeUpdate(); IA zZ1#/3
sm.close(); W<ZK,kv
3、提交 ^ >x|z.
cn.commit(); qVqRf.-\
4、如果发生异常,那么回滚 g6t"mkMY
L
cn.rollback();