java 数据库基本操作 8bW,.to(?x
1、java数据库操作基本流程 ]n (:X
2、几个常用的重要技巧: VY_<c 98v
可滚动、更新的记录集 xI,7ld~
批量更新 XpoEZ|0
事务处理 @zAav>
U!Eo*?LU$
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,e!9WKJ
B
1、取得数据库连接 x'hUw*
1)用DriverManager取数据库连接 pjrzoMF
例子 .jvRUD8A7
String className,url,uid,pwd; bbAJ5EqL
className = "oracle.jdbc.driver.OracleDriver"; >gGdzL
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; m8C
scCZ}
uid = "system"; X+;{&Efrl
pwd = "manager";
_MST8
Class.forName(className); E;)7#3gY1
Connection cn = DriverManager.getConnection(url,uid,pwd); O.^1r
2)用jndi(java的命名和目录服务)方式 0VwmV_6'<W
例子 026|u|R
String jndi = "jdbc/db"; !a<}Mpeg
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); NkL>ru!b9
DataSource ds = (DataSource) ctx.lookup(jndi); ?^3Q5ye
Connection cn = ds.getConnection(); J4>k9~q
多用于jsp中 *7:HO{P>Y
2、执行sql语句 U1~6 o"1H
1)用Statement来执行sql语句 wTK>U`o
String sql; #(f- cK
Statement sm = cn.createStatement(); 6gN>P%n
sm.executeQuery(sql); // 执行数据查询语句(select) 5"o)^8!>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); } D0Y8
2)用PreparedStatement来执行sql语句 U?sio%`(
String sql;
0gOB$W
sql = "insert into user (id,name) values (?,?)"; QZ^P2==x
PreparedStatement ps = cn.prepareStatement(sql); 0Er;l|
ps.setInt(1,xxx); %X>P+6<=
ps.setString(2,xxx); SXx;-Ws
... :rhh=nHgn
ResultSet rs = ps.executeQuery(); // 查询 >cM}M =4s
int c = ps.executeUpdate(); // 更新 vivU4:uH3
<|R`N)AV;
3、处理执行结果 G$_=rHt_%
查询语句,返回记录集ResultSet PS3%V_2
更新语句,返回数字,表示该更新影响的记录数 . L'eVLQe
ResultSet的方法 fx`oe
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "[M k5tM
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 jZLD^@AP
?> 7SZiC`
4、释放连接 JMIS*njq^
cn.close(); `-QY<STTP9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 3D*vNVI
Tyk\l>S
可滚动、更新的记录集 qp)a`'Pq
1、创建可滚动、更新的Statement Q\k|pg?
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); q/l@J3p[qm
该Statement取得的ResultSet就是可滚动的 6Lhfb\2?
2、创建PreparedStatement时指定参数 LYvjqNC&4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); H%
"R _[+
ResultSet.absolute(9000); NP?hoqeKs
批量更新 p@Ng.HE
1、Statement /UAcN1K!B
Statement sm = cn.createStatement(); 8M9}os
sm.addBatch(sql1); ZuIw4u(9
sm.addBatch(sql2); +rcDA|
... iD-,C`
sm.executeBatch() 4(O;lVT}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 G"&yE.E5
2、PreparedStatement sn6:\X<[
PreparedStatement ps = cn.preparedStatement(sql); yB~`A>~M
{ &hri4p/
ps.setXXX(1,xxx); :SD^?.W\iT
... tH\ aHU[
ps.addBatch(); f~{@(g&Gl
} vx&r
ps.executeBatch(); ZlxJY%oeu
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 h%yw'?s
pz]T9ol~
事务的处理 C\WU<!
1、关闭Connection的自动提交 yw3E$~ k
cn.setAutoCommit(false); uv$t>_^
2、执行一系列sql语句 Dd:;8Xo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close S+7:fu2?+
Statement sm ; \gE6KE<?p
sm = cn.createStatement(insert into user...); nC;2wQ6aO
sm.executeUpdate();
S_EN,2'e
sm.close(); _T)G?iv:&
sm = cn.createStatement("insert into corp...); Kf!8PR$
sm.executeUpdate(); '.8E_Jd0E
sm.close(); 5\6S5JyIL
3、提交 *#n?6KqZ
cn.commit(); t:?8I9d
4、如果发生异常,那么回滚 FBCi,_
\4
cn.rollback();