java 数据库基本操作 J\co1kO9/
1、java数据库操作基本流程 f[~1<;|-
2、几个常用的重要技巧: 0%C^8%(x
可滚动、更新的记录集 C0C0GqN,
批量更新 H'g?llh1J
事务处理 4cgIEw[6
S>:,z}i
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 =]>%t]
1、取得数据库连接 4*H"Z(HP
1)用DriverManager取数据库连接 >%%=0!,yX
例子 -$k>F#
String className,url,uid,pwd; xF8S*,#,*
className = "oracle.jdbc.driver.OracleDriver"; I}0_nge
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _9If/RD
uid = "system"; j'rS&BIG
pwd = "manager"; m2bDHQ+
Class.forName(className); 6qp5Xt+
Connection cn = DriverManager.getConnection(url,uid,pwd); I44s(G1jl
2)用jndi(java的命名和目录服务)方式 wz(K*FP
例子 440FhDMj
String jndi = "jdbc/db"; }0/a\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); F1W+o?B
DataSource ds = (DataSource) ctx.lookup(jndi); zmFws-+A
Connection cn = ds.getConnection(); :[7lTp
多用于jsp中 MiGcA EF;
2、执行sql语句 n'w,n1z7
1)用Statement来执行sql语句 v548ysE)
String sql; 5G*II_j
Statement sm = cn.createStatement(); :hqZPajE
sm.executeQuery(sql); // 执行数据查询语句(select) m#@_8_ M
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); hl/itSl$
2)用PreparedStatement来执行sql语句 a|qsQ'1,;
String sql; MK$Jj"
sql = "insert into user (id,name) values (?,?)"; .KA V) So"
PreparedStatement ps = cn.prepareStatement(sql); |ng%PQq)
ps.setInt(1,xxx); POd/+e9d
ps.setString(2,xxx); bg7n
... BW K IbG
ResultSet rs = ps.executeQuery(); // 查询 Wr%7~y*K
int c = ps.executeUpdate(); // 更新 I48VNX
,@CfVQz
3、处理执行结果 4('JwZw\!
查询语句,返回记录集ResultSet 8C&x MA^
更新语句,返回数字,表示该更新影响的记录数 9C}qVoNu
ResultSet的方法 {U @3yB
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &"S/Lt
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 +<(a}6dt
&^QPkX@p
4、释放连接 AlX3Wv}
cn.close(); :=!Mh}i
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection y?:dE.5p|
YMzBAf
可滚动、更新的记录集 Go8F5a@j
1、创建可滚动、更新的Statement !D:k!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F@SG((`
该Statement取得的ResultSet就是可滚动的 *@M3p}',M
2、创建PreparedStatement时指定参数 %J P!{mqj
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3'#%c>_
ResultSet.absolute(9000); 8 njuDl
批量更新 X#J6Umutm
1、Statement L(o#4YH}>J
Statement sm = cn.createStatement(); (cV
sm.addBatch(sql1); rw u3Nb
sm.addBatch(sql2); qu{mqkfN>
... J_"3UZ~&
sm.executeBatch() {BOLPE-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3 wt
2、PreparedStatement (2txM"Dja
PreparedStatement ps = cn.preparedStatement(sql); PZOORjF8A
{ YKx 1NC
ps.setXXX(1,xxx); .h8M
... \qq-smcM-
ps.addBatch(); k|j:T[_
} L|67f4
ps.executeBatch(); ?!S
GiARW?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Yn<)k_kp
[b1hC ~I;
事务的处理 [thboP.?
1、关闭Connection的自动提交 n`<S&KP|
cn.setAutoCommit(false); @PXXt#
2、执行一系列sql语句 y^s1t2]%
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2ksA.,UB^9
Statement sm ; )Vk:YL++
sm = cn.createStatement(insert into user...); qx%jAs+~
sm.executeUpdate(); rO^xz7K^
sm.close(); 2%YXc|gGT
sm = cn.createStatement("insert into corp...); DrS?=C@
sm.executeUpdate(); ^, wnp@
sm.close(); $c=&0yt5
3、提交 oyvtZ/@
cn.commit(); mxL;;-
4、如果发生异常,那么回滚 TzF0/T!
cn.rollback();