java 数据库基本操作 20l_ay
1、java数据库操作基本流程 Sci4EGc
2、几个常用的重要技巧: Wx?&igh
可滚动、更新的记录集 Cld<D5\|f+
批量更新 Bf:tal6 -M
事务处理 9;]wF8h
5Z6-R}uXk
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 MkW1FjdP
1、取得数据库连接 e(w/m(!Wny
1)用DriverManager取数据库连接 { w8
!K
例子 ]\RSHz
String className,url,uid,pwd; *$Lz2 ]
className = "oracle.jdbc.driver.OracleDriver"; Z-t}6c'Kg
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; :-u-hO5*8
uid = "system"; `e?;vA&
pwd = "manager"; G?1x+H;o5
Class.forName(className); qTTn51
Connection cn = DriverManager.getConnection(url,uid,pwd); 9R@abm,I
2)用jndi(java的命名和目录服务)方式 m c\ C
例子 2#b<d?"
String jndi = "jdbc/db"; dT]L-uRZgy
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 974eY
DataSource ds = (DataSource) ctx.lookup(jndi); PPCTc|G
Connection cn = ds.getConnection(); &7($kj
多用于jsp中 r2SJp@f
2、执行sql语句 uGa(_ut
1)用Statement来执行sql语句 'l'
X^LMD
String sql; /~Zc}o,J
Statement sm = cn.createStatement(); ~)wwX:;B_
sm.executeQuery(sql); // 执行数据查询语句(select) <+\k&W&Y|y
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~TG39*m
2)用PreparedStatement来执行sql语句 a*6wSAA )
String sql; B 9LSxB
sql = "insert into user (id,name) values (?,?)"; R2N^'
PreparedStatement ps = cn.prepareStatement(sql); *f `s%&Y]s
ps.setInt(1,xxx); bk7^%O>
ps.setString(2,xxx); f^!11/Wv
... Yz2{LW[K
ResultSet rs = ps.executeQuery(); // 查询 BZJKiiD
int c = ps.executeUpdate(); // 更新 |I}A>XG
Kd/[Bs%
3、处理执行结果 "J P{Q
查询语句,返回记录集ResultSet >HcYVp~G
更新语句,返回数字,表示该更新影响的记录数 _b0S
ResultSet的方法 m|[\F#+C
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &@4.;u
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 NWJcFj_
Z[#I"-Q~:
4、释放连接 Iys6R?~
cn.close(); HZDk
<aU/!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection %Lp2jyv.
MUbhEau?
可滚动、更新的记录集 5;FP.{+
1、创建可滚动、更新的Statement V<i<0E
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); px w{
该Statement取得的ResultSet就是可滚动的 :3a&Pb*PL
2、创建PreparedStatement时指定参数 ;23=p=/h
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); n2n00%Wu[
ResultSet.absolute(9000); #"Eks79s
批量更新 S)"##-~`T
1、Statement YKP=0 j3,
Statement sm = cn.createStatement(); 5jn$7iE`
sm.addBatch(sql1); ,VKQRmd
sm.addBatch(sql2); 0 NQ7#A
... {A]k%74-a
sm.executeBatch() 0rk u4T
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 a9#W9eP
2、PreparedStatement w::r?.9
PreparedStatement ps = cn.preparedStatement(sql); ^273l(CZ1
{ "H5&3sF2
ps.setXXX(1,xxx); a3O nW\N
... |x d@M-ln
ps.addBatch(); j:HH#U
} A$7Eo`Of
ps.executeBatch(); Lzh9DYU6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <ZigCo w
x1Nme%%&
事务的处理 v[R_S
1、关闭Connection的自动提交 $Hp.{jw
cn.setAutoCommit(false); 2;~KL-h0TK
2、执行一系列sql语句 \|4 Ca't
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close '1CD-
Bu
Statement sm ; 4@DVc7\x$
sm = cn.createStatement(insert into user...); M'\pkzx
sm.executeUpdate(); pNp^q/-yB
sm.close(); 13ipaz
sm = cn.createStatement("insert into corp...); @<vF]\Ce
sm.executeUpdate(); _/|8%])
sm.close(); i[^k.W3gf
3、提交 1KW3l<v-6
cn.commit(); 3hc#FmLr2b
4、如果发生异常,那么回滚 `6rrXU6|
cn.rollback();