java 数据库基本操作 _7j/[
1、java数据库操作基本流程 #;*ai\6>vD
2、几个常用的重要技巧: C O%O<_C
可滚动、更新的记录集 (krG0S:0Q
批量更新 RH'F<!p
事务处理 FO'.
a
ZV<y=F*~f
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Ff#N|L'9_
1、取得数据库连接 fN*4(yw
1)用DriverManager取数据库连接 ubC JZ"!
例子 k#=leu"I
String className,url,uid,pwd; 7quwc'!
className = "oracle.jdbc.driver.OracleDriver"; r+#V{oE_
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; = cI\OsV&?
uid = "system"; Y`O}]*{>8R
pwd = "manager"; Y)j,(9
Class.forName(className); 5$"[gdt)T
Connection cn = DriverManager.getConnection(url,uid,pwd); {8bY7NH|
2)用jndi(java的命名和目录服务)方式 +$m skj0s
例子 HG3>RcB
String jndi = "jdbc/db"; qP^0($
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); E~g}DKs_5
DataSource ds = (DataSource) ctx.lookup(jndi); )RCqsFjK
Connection cn = ds.getConnection(); J0WXH/:
多用于jsp中 K?O X
2、执行sql语句 ~z1KD)^
1)用Statement来执行sql语句 eg~^wi
String sql; sK9h=J;F/
Statement sm = cn.createStatement(); k&"qdB(I
sm.executeQuery(sql); // 执行数据查询语句(select) {FmFu$z+[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); UCj#t!Mw
2)用PreparedStatement来执行sql语句 a3
_0F@I
String sql; Xiedg y
sql = "insert into user (id,name) values (?,?)"; qF6%XKbh=
PreparedStatement ps = cn.prepareStatement(sql); e"H+sM26-
ps.setInt(1,xxx); <sFf'W_3{
ps.setString(2,xxx); ];}|h|q/{}
...
iIEIGQx
ResultSet rs = ps.executeQuery(); // 查询 'nDT.i
int c = ps.executeUpdate(); // 更新 |2&mvjk@H
;WAu]C|
3、处理执行结果 awW\$Q
查询语句,返回记录集ResultSet K$v Rk5U
更新语句,返回数字,表示该更新影响的记录数 Pk]9.e1_
ResultSet的方法 lRK?%~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,v5>sL
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 !skWe~/
h=y(2xA
4、释放连接 tJ_@AcF
cn.close(); Fl>j5[kLZ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 1'pQ,
xs`gN
可滚动、更新的记录集 |w]i$`3'I
1、创建可滚动、更新的Statement 5h^qtK
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 0H]9$D
该Statement取得的ResultSet就是可滚动的 %LlKi5u]
2、创建PreparedStatement时指定参数 2}\sj'0&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); os ud
ResultSet.absolute(9000); &'2l_b
批量更新 p
8Hv7*
1、Statement AG%es0D[H
Statement sm = cn.createStatement(); {cHTg04
sm.addBatch(sql1); K{h]./%
sm.addBatch(sql2); Cu<ojN- $
... .z7f_KX^
sm.executeBatch() pnb$lpxt
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 FsZEB/c
2、PreparedStatement sh3}0u+
PreparedStatement ps = cn.preparedStatement(sql); Ec/+ 9H6g
{ BU\NBvX$
ps.setXXX(1,xxx); cJ{P,K
...
xx#Ef@bS
ps.addBatch(); 9.}3RAB(cv
} <sG> [\i
ps.executeBatch(); =n?@My?;
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 H t$%)j9
o|.me G
事务的处理 X
KeK;+
1、关闭Connection的自动提交 md_s2d
cn.setAutoCommit(false); ?&^l8gE
2、执行一系列sql语句 $k=rd#3
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close `b$I)UUm
Statement sm ; *g.,[a0
sm = cn.createStatement(insert into user...); > _) a7%
sm.executeUpdate(); uB! P>v6
sm.close(); X,Q(W0-6$u
sm = cn.createStatement("insert into corp...); ../(gG9
sm.executeUpdate(); 1x8]&
sm.close(); F<1'M#bl
3、提交 @}}1xP4Sr
cn.commit(); +o5rR|)M+
4、如果发生异常,那么回滚 wIPDeC4
cn.rollback();