java 数据库基本操作 &aRL}#U
1、java数据库操作基本流程 4#IT" i
2、几个常用的重要技巧: \W*L9azr
可滚动、更新的记录集 ]rv\sD`[
批量更新 E{\CE1*
事务处理 P(shbi@
-pC'C%Q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 \bARp z?a
1、取得数据库连接 O*~,L6# }
1)用DriverManager取数据库连接 p":u]Xgb
例子 /QQRy_Z1)
String className,url,uid,pwd; QY;(Ny/(y
className = "oracle.jdbc.driver.OracleDriver"; Tx.N#,T|
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 5 bI:xL}
uid = "system"; KuP#i]Na
pwd = "manager"; d"FB+$
Class.forName(className); l eC!Yj
Connection cn = DriverManager.getConnection(url,uid,pwd); WGv 47i
2)用jndi(java的命名和目录服务)方式 c e;7
例子 GB$`b'x@S
String jndi = "jdbc/db"; ga
+,
P
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 30sJ"hF9
DataSource ds = (DataSource) ctx.lookup(jndi); u}%OC43
Connection cn = ds.getConnection(); B'yjMY![
多用于jsp中 n[jXqFm!`
2、执行sql语句 H^-Y]{7
1)用Statement来执行sql语句 {xZY4b2
String sql; 7fR5V
Statement sm = cn.createStatement();
^{}G4BEY
sm.executeQuery(sql); // 执行数据查询语句(select) *p(_="J,
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); A$@;Q5/2
2)用PreparedStatement来执行sql语句 F=qILwd
String sql; $]DuO1H./
sql = "insert into user (id,name) values (?,?)"; @7nZjrH
PreparedStatement ps = cn.prepareStatement(sql); D)PX |xrn
ps.setInt(1,xxx); $4{sPHi)I
ps.setString(2,xxx); 1K9.3n
... bYP8
ResultSet rs = ps.executeQuery(); // 查询 21v--wZ
int c = ps.executeUpdate(); // 更新 Ge2Klyi
2PQBUq
3、处理执行结果 7z;2J;u`n
查询语句,返回记录集ResultSet +Csb8
更新语句,返回数字,表示该更新影响的记录数 -YQh
F;/
ResultSet的方法 4V:W 8k 9D
1、next(),将游标往后移动一行,如果成功返回true;否则返回false <SNr\/aCRi
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 V48_aL
j6l1<3j
4、释放连接
AOg'4
cn.close(); XCI
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .eN"s'
$[X][[
可滚动、更新的记录集 |5vJ:'` I
1、创建可滚动、更新的Statement \aJ>?
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |mH* I
该Statement取得的ResultSet就是可滚动的 KiXfR\S~C
2、创建PreparedStatement时指定参数 F$8:9eL,T
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); V=ll 9M
ResultSet.absolute(9000); 9y7hJib
批量更新 w,IJ44f ^%
1、Statement --]blP7
Statement sm = cn.createStatement(); 9Z-2MF
sm.addBatch(sql1); 5J`w8[;
sm.addBatch(sql2); %X_A# 9
... '
wl})
sm.executeBatch() nT|WJ%
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 a~yiLq
2、PreparedStatement Kz;Ar&^`N
PreparedStatement ps = cn.preparedStatement(sql); jsAx;Z:QT
{ QDxs+<#
ps.setXXX(1,xxx); N #v[YO`.
... HW[&q
ps.addBatch(); 1HO;~NJ]m
} 2(d
ps.executeBatch(); @|(cr: (=H
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;jgf,fbM
B9"d7E#wHF
事务的处理 Sv#MlS>
1、关闭Connection的自动提交 N-l`U(Z~P
cn.setAutoCommit(false); yM 7{v$X0
2、执行一系列sql语句 L$Z!
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Nd( I RsH(
Statement sm ; rT R$\ [C
sm = cn.createStatement(insert into user...); _7N?R0j^9N
sm.executeUpdate(); ;I5P<7VW
sm.close(); -+){ ;,
sm = cn.createStatement("insert into corp...); {EZR}N
sm.executeUpdate(); T4W20dxL7
sm.close(); 6OE
xAn8
3、提交 CY?J$sN
cn.commit(); EC\@$Fg
4、如果发生异常,那么回滚 D<v<
:
cn.rollback();