java 数据库基本操作 idP2G|Z
1、java数据库操作基本流程 OO?BN!
2、几个常用的重要技巧: _Dg|Iz,Uh
可滚动、更新的记录集 Pu0O6@Rg
批量更新 MryY<s
事务处理 5tu 4uYp;
Ov~>* [
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )tR@\G >%
1、取得数据库连接 9d >AnTf&H
1)用DriverManager取数据库连接 :LMLY<8>9
例子 6+_qGV
String className,url,uid,pwd; Ub*O*nre
className = "oracle.jdbc.driver.OracleDriver"; CW;=q[+w
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; \XgpwvO".
uid = "system"; >0jg2vqt
pwd = "manager"; {w VJv1*l
Class.forName(className); &/]g@^h9
Connection cn = DriverManager.getConnection(url,uid,pwd); )p+6yH
2)用jndi(java的命名和目录服务)方式 K Fn[
例子 drf?7%v
String jndi = "jdbc/db"; jf~-;2
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @6z]Xb
DataSource ds = (DataSource) ctx.lookup(jndi); 6#Afj0
Connection cn = ds.getConnection(); #bdSH)V
多用于jsp中 (GDW9:
2、执行sql语句 ^q)s
1)用Statement来执行sql语句 \6c8Lqa
String sql; t8upS
u|
Statement sm = cn.createStatement(); Yuqt=\? #
sm.executeQuery(sql); // 执行数据查询语句(select) fg0zD:@rA
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )2y#
cM*
2)用PreparedStatement来执行sql语句 .l ufE
String sql; e"ur+7
sql = "insert into user (id,name) values (?,?)"; 5"I8ric
PreparedStatement ps = cn.prepareStatement(sql); /.%AE|0+X
ps.setInt(1,xxx); L{AfrgN
ps.setString(2,xxx); _';oT*#
... ,e5#wz
ResultSet rs = ps.executeQuery(); // 查询 -_"6jU
int c = ps.executeUpdate(); // 更新 :]k`;;vh
$"6O92G(hJ
3、处理执行结果 U8R*i7
查询语句,返回记录集ResultSet pv ;ZR
更新语句,返回数字,表示该更新影响的记录数 ^+'\
u;\
ResultSet的方法 B@v"giJg r
1、next(),将游标往后移动一行,如果成功返回true;否则返回false X) xeq
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4n,>EA85
:7jDgqn^|i
4、释放连接 `oGL==
cn.close(); h}cR>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =^S1+B
MY-
"3X~BdH&J
可滚动、更新的记录集 KO5! (vi@
1、创建可滚动、更新的Statement k_hs g6Ur.
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Q"=$.M~
该Statement取得的ResultSet就是可滚动的 %[H|3
2、创建PreparedStatement时指定参数 [BzwQ 4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); YVS~|4hu?i
ResultSet.absolute(9000); zKX|m-i|2
批量更新 !;s5\91
1、Statement Ht=h9}x"g
Statement sm = cn.createStatement(); }D\i1/Y
sm.addBatch(sql1); ~_Q1+ax}
sm.addBatch(sql2); W"*~1$vf
... ,"EgYd8-'
sm.executeBatch() 86<[!ZM
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 -"MB(`
2、PreparedStatement ),]XN#jp(u
PreparedStatement ps = cn.preparedStatement(sql); g|rbkK%SoE
{ kKEs >a
ps.setXXX(1,xxx); 9L9+zs3k
... On4tK\l@
ps.addBatch(); .sR=Mf7 T
} Tkf
JC|6
ps.executeBatch(); EQ>] ~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 W$ag
|WV
QC^#ns&
事务的处理 ( ,!G$~Sy
1、关闭Connection的自动提交 #Qnl,lf
cn.setAutoCommit(false); {;| >Qn
2、执行一系列sql语句 t,vj)|:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close S1D=' k]
Statement sm ; <9jN4hV
sm = cn.createStatement(insert into user...); rf]'VJg#3
sm.executeUpdate(); ?A`8c R=)I
sm.close(); c#YW>(
sm = cn.createStatement("insert into corp...); U9eb&nd
sm.executeUpdate(); aokV'6
sm.close(); `37$YdX
3、提交 CFyu9Al
cn.commit(); $F/Uk;*d!
4、如果发生异常,那么回滚 yTwtGo&
cn.rollback();