java 数据库基本操作 ;PJWd|3
1、java数据库操作基本流程 . oUaq|O
2、几个常用的重要技巧: IEdC
_6G
可滚动、更新的记录集 d(w
$! $"h
批量更新 \CL |=8[2
事务处理 #:Di1I9<O7
mk1;22o{TX
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 })Rmu."\
1、取得数据库连接 ~<3qsA..
1)用DriverManager取数据库连接 1<^"OjQ
例子 UHz*Tfjb
String className,url,uid,pwd; LQ?J
r>4
className = "oracle.jdbc.driver.OracleDriver"; -3X#$k8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -Xkdu?6Eh
uid = "system"; y>u+.z a|
pwd = "manager"; [zK|OMxoV
Class.forName(className); *L/_ v
Connection cn = DriverManager.getConnection(url,uid,pwd); 46*o_A,"
2)用jndi(java的命名和目录服务)方式 d5]9FIj
例子 q,2]]K7y
String jndi = "jdbc/db"; iqghcY)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Vf*!m~]Vqi
DataSource ds = (DataSource) ctx.lookup(jndi);
"=H7p3
Connection cn = ds.getConnection(); )ye[R^!}
多用于jsp中 }
O9q$-8!
2、执行sql语句 Oe^3YOR#j{
1)用Statement来执行sql语句 ,>2ijk#
String sql; X_|8CD-@6
Statement sm = cn.createStatement();
C+,;hj
sm.executeQuery(sql); // 执行数据查询语句(select) W{Ie(hf
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8^$}!9B~JZ
2)用PreparedStatement来执行sql语句 D*`|MzlQ
String sql; RM-|?%
sql = "insert into user (id,name) values (?,?)"; NyJU?^f&v
PreparedStatement ps = cn.prepareStatement(sql); Q}W6?XDu
ps.setInt(1,xxx); 09 eS&J<R
ps.setString(2,xxx); lKI1bs]i
... 6CLrP}
u
ResultSet rs = ps.executeQuery(); // 查询 95aa
int c = ps.executeUpdate(); // 更新 J:'cj5@
WO)rJr!C
3、处理执行结果 6t
TLyI$+
查询语句,返回记录集ResultSet r`i<XGPJ%
更新语句,返回数字,表示该更新影响的记录数 -Duy:C6W
ResultSet的方法 +%6{>C+bZo
1、next(),将游标往后移动一行,如果成功返回true;否则返回false S3:Pjz}t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 0(ZER sP
<m`HK.|~
4、释放连接 I_'S|L
cn.close(); }-)2CEj3L%
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [U]*OQH`e
A"\kdxC
可滚动、更新的记录集 4t|g G`QW7
1、创建可滚动、更新的Statement Vur$t^zE
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,`G8U/
该Statement取得的ResultSet就是可滚动的 VCcLS3
2、创建PreparedStatement时指定参数 i15uHl
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 7NMQUN7k'
ResultSet.absolute(9000); - P1OD)B
批量更新 8Cs)_bj#!
1、Statement q0.+ F4
Statement sm = cn.createStatement(); ^P~%^?(
sm.addBatch(sql1); U'UV=:/-
sm.addBatch(sql2); }/[tB
... ={W;8BUV%^
sm.executeBatch() "dXRUg"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4!d&Zc>C4
2、PreparedStatement 782be-n
PreparedStatement ps = cn.preparedStatement(sql); `&4L'1eF{
{ K!5QFO4
ps.setXXX(1,xxx); 234OJ?
... j@v*q\X&
ps.addBatch(); Y;p _ff
} $s4 rG=q
ps.executeBatch(); x<"1T
w5e
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ^vYH"2
]=2Ba<)m
事务的处理
b~Op1p
1、关闭Connection的自动提交 d47b&.v8e
cn.setAutoCommit(false); 5.]+K<:h"A
2、执行一系列sql语句 vJ7I
[Z
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close LgjL+w19
Statement sm ; IwKhun
sm = cn.createStatement(insert into user...); @T._
sm.executeUpdate(); I(#Y\>DG
sm.close(); =;7gxV3;
sm = cn.createStatement("insert into corp...); +b.<bb6
sm.executeUpdate(); (LA%q6
sm.close(); JaXT
B"e
3、提交 75r>~@)*
cn.commit(); VljAAt
4、如果发生异常,那么回滚 Ha@'%<gFe
cn.rollback();