java 数据库基本操作 ;IV
1、java数据库操作基本流程 287g 5
2、几个常用的重要技巧: 4)Jtc2z7Z\
可滚动、更新的记录集 c_V^~hq
批量更新 j8P qc]
事务处理 CG#lpAs
srS2v\1:
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 rF@njw@
1、取得数据库连接 /;5U-<qf
1)用DriverManager取数据库连接 {*yFTP"93
例子 ws/e~ T<c
String className,url,uid,pwd; 69q#Zw[,,
className = "oracle.jdbc.driver.OracleDriver"; # <?igtUO
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; QK~44;LVIJ
uid = "system"; FS'|e?WU
pwd = "manager"; 8-#_xsZ^;
Class.forName(className); ov3FKMG?
Connection cn = DriverManager.getConnection(url,uid,pwd); PI G3kJ
2)用jndi(java的命名和目录服务)方式 nm#ISueh
例子 y
J|/^qs
String jndi = "jdbc/db"; 1R-1#<a>&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); IvZ,|R?
DataSource ds = (DataSource) ctx.lookup(jndi); Ga<Uvr%+
Connection cn = ds.getConnection(); Ow"e3]}Mt
多用于jsp中 }>93X0%r
2、执行sql语句 4 H<.
1)用Statement来执行sql语句 R!)3{cjU@
String sql; T 6ihEb$C
Statement sm = cn.createStatement(); ^Uq%-a
sm.executeQuery(sql); // 执行数据查询语句(select) fk*I}pDx
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); W(4Mvd
2)用PreparedStatement来执行sql语句 y
-6{>P/
String sql; k2 _i;v
sql = "insert into user (id,name) values (?,?)"; cePe0\\
PreparedStatement ps = cn.prepareStatement(sql); 6
4,('+
ps.setInt(1,xxx); oMNt676
ps.setString(2,xxx); !k3 eUBF
... cy-o@U"s8
ResultSet rs = ps.executeQuery(); // 查询 UWXl
c
int c = ps.executeUpdate(); // 更新 02$d
q"@>rU4
3、处理执行结果 ayGcc`
查询语句,返回记录集ResultSet XJZ\ss
更新语句,返回数字,表示该更新影响的记录数 ?td`*n~,
ResultSet的方法 Vb @lK~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false G-6k[-@-v
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 1G'D'
IgIM8"N
4、释放连接 .IU\wN
cn.close(); L*6R5i>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection "M;aNi^B
fEo5j`}
可滚动、更新的记录集 m{gw:69h
1、创建可滚动、更新的Statement 8P?p
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); BQ:hUF3
该Statement取得的ResultSet就是可滚动的 !qu/m B
2、创建PreparedStatement时指定参数 u<['9U
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ""@kBY1C
ResultSet.absolute(9000); \<aR^Sj.
批量更新 `VrQ?s
1、Statement {Mpx33
Statement sm = cn.createStatement(); 56?RFnZ&j
sm.addBatch(sql1); wi/qI(O!
sm.addBatch(sql2); fsjCu!
... eKUP,y;[I
sm.executeBatch() ~tc,p
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !AXt6z cZ
2、PreparedStatement b!<\#[
A4
PreparedStatement ps = cn.preparedStatement(sql); drQI@sPp
{ .fgVzDR|+
ps.setXXX(1,xxx); >~;=
j~
... V8hmfV~=]P
ps.addBatch(); F$j?}
} G"F)t(iX
ps.executeBatch(); g-~]^ $
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 aGAeRF
["_+~*
事务的处理 I~ 1Rt+:
1、关闭Connection的自动提交 m9=93W?
cn.setAutoCommit(false); Pihpo
2、执行一系列sql语句 J# DN2y<
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close )Drif\FF)
Statement sm ; +;ylld
sm = cn.createStatement(insert into user...); hHk9O?
sm.executeUpdate(); $KVCEe!X
sm.close(); `%/w0,0
sm = cn.createStatement("insert into corp...); G,}"}v:
sm.executeUpdate(); Y 8n*o3jM
sm.close(); R=J5L36F
3、提交 @~QI3)=s
cn.commit(); ?j;,:n
4、如果发生异常,那么回滚 ~f:"Q(f+
cn.rollback();