java 数据库基本操作 h
$)thW
1、java数据库操作基本流程 sX53(|?*
2、几个常用的重要技巧: jRIjFn|~{Y
可滚动、更新的记录集 . 2_t/2
批量更新
/;LteBoY
事务处理 k1;,eB
[?TQ!l} 8A
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .gUceXWH3
1、取得数据库连接 z{T2!w~[
1)用DriverManager取数据库连接 G"!YV#"~
例子 'TclH80
String className,url,uid,pwd; ~/?JRL=
className = "oracle.jdbc.driver.OracleDriver"; |F5^mpU
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; L8-
uid = "system"; =uKGh`^[
pwd = "manager"; _i [.5
Class.forName(className); : sIZ+3
Connection cn = DriverManager.getConnection(url,uid,pwd); G#V5E)Dx
2)用jndi(java的命名和目录服务)方式 w`XwW#!}@$
例子 cyUNJw
String jndi = "jdbc/db"; ( 8+ _~_
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1lRqjnzve&
DataSource ds = (DataSource) ctx.lookup(jndi); 6S?a57;&W
Connection cn = ds.getConnection(); dIv/.x/V
多用于jsp中 6GzmzhX4
2、执行sql语句 E\!:MCL
1)用Statement来执行sql语句 oH~ZqX.3
String sql; M
(dVY/ i
Statement sm = cn.createStatement(); QrDrdA
sm.executeQuery(sql); // 执行数据查询语句(select) _@D}2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); rXo2MX@u
2)用PreparedStatement来执行sql语句 Bu?"b=B*
String sql; DJgk"'
sql = "insert into user (id,name) values (?,?)"; Gjuc"JR7
PreparedStatement ps = cn.prepareStatement(sql); wqo2iRql
ps.setInt(1,xxx); ?QO)b9
ps.setString(2,xxx); j}YZl@dYV
... @(.?e<
ResultSet rs = ps.executeQuery(); // 查询 (zkh`8L
int c = ps.executeUpdate(); // 更新 01I5,Dm
R`=IYnoOA
3、处理执行结果 <x@\3{{U
查询语句,返回记录集ResultSet p-V#nPb
更新语句,返回数字,表示该更新影响的记录数 D[{p~x^
ResultSet的方法 V M[9!:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &*g5kh{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 S8j;oJ2d
Y1AbG1n|
4、释放连接 Ne/jvWWN
cn.close(); /:dVW"A|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection nut;ohIh
{(G@YG?
可滚动、更新的记录集 %o<&O(Y
1、创建可滚动、更新的Statement "hz(A.THi
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); s<0yQ-=.?N
该Statement取得的ResultSet就是可滚动的 Vja' :i
2、创建PreparedStatement时指定参数 FVLXq0<Cj
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); L]0+u\(
ResultSet.absolute(9000); SqY;2:
批量更新 jM
J[6qj
1、Statement "d'xT/l
"
Statement sm = cn.createStatement(); yZI4%fen
sm.addBatch(sql1); ZTd_EY0 q
sm.addBatch(sql2); pfg"6P
... 'ntb.S)
sm.executeBatch() en7i})v\".
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H^"BK-`hs
2、PreparedStatement :YjOv
PreparedStatement ps = cn.preparedStatement(sql); Tp~yn
{ ]>E9v&X0
ps.setXXX(1,xxx); mh44
... d%9I*Qo0,
ps.addBatch(); sAk~`(:4!
} '.~vN L+
O
ps.executeBatch(); _5M!ec
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )?'sw5C
,)V*xpp
事务的处理 lsW.j#yE!
1、关闭Connection的自动提交 S$%/9^\jF
cn.setAutoCommit(false); 6f6_ztTL
2、执行一系列sql语句 aGp <%d
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6N.mSnp
Statement sm ; 0]8+rWp|Nz
sm = cn.createStatement(insert into user...); FVG|5'V^
sm.executeUpdate(); 3leg,qd
sm.close(); ^w2n
sm = cn.createStatement("insert into corp...); &.kg8|s{
sm.executeUpdate(); t,N-|
sm.close(); v)N6ZOj*C
3、提交 i#lvt#2J0
cn.commit(); w ;H
4、如果发生异常,那么回滚 &g,K5at
cn.rollback();