java 数据库基本操作 )Uo)3FAn
1、java数据库操作基本流程 z;2kKQZm
2、几个常用的重要技巧: ,M5zhp$
可滚动、更新的记录集 #92MI#|n9
批量更新 <vhlT#p
事务处理 'HH[[9Q
zxT&K|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u\Tq5PYXt
1、取得数据库连接 D)K/zh)
1)用DriverManager取数据库连接 '\[GquK;P
例子 `G@]\)-!
String className,url,uid,pwd; WVir[Kv%
className = "oracle.jdbc.driver.OracleDriver"; o~*% g.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; mj{TqF
uid = "system"; rB<
UOe
pwd = "manager"; (wo.OH
Class.forName(className); |9@?8\
Connection cn = DriverManager.getConnection(url,uid,pwd); >#)^4-e
2)用jndi(java的命名和目录服务)方式 !QSL8v@c
例子 =M*31>"I0
String jndi = "jdbc/db"; E}b"
qOV
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3.xsCcmP
DataSource ds = (DataSource) ctx.lookup(jndi); qVx4 t"%L>
Connection cn = ds.getConnection(); rMdOE&5G
多用于jsp中 gcQ>:mi
2、执行sql语句 mXAX%M U
1)用Statement来执行sql语句 ;Ze}i/l
String sql; G ZDyw9
Statement sm = cn.createStatement(); 8I$>e (
sm.executeQuery(sql); // 执行数据查询语句(select) */u_RJ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]wc'h>w
2)用PreparedStatement来执行sql语句 l _dWS9
String sql; 5,Mc`IIK1
sql = "insert into user (id,name) values (?,?)"; ?|w>."F
PreparedStatement ps = cn.prepareStatement(sql); d3St Z~&r!
ps.setInt(1,xxx); `!K(P- yB?
ps.setString(2,xxx); Xt_8=Q
... 9NBFG~)|l[
ResultSet rs = ps.executeQuery(); // 查询 tux/@}I
int c = ps.executeUpdate(); // 更新 OT+=H)/
a{GPAzO+
3、处理执行结果 [?Cv^t${+
查询语句,返回记录集ResultSet N!
}p
更新语句,返回数字,表示该更新影响的记录数 C-V,3}=*2
ResultSet的方法 7b_t%G"
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 4%Z! *W*
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 xVfAlN37(
)R(kXz=M
4、释放连接 wzwEYZN(q
cn.close(); W_Z%CBjcT
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection sC(IeGbX
$^?Mip
可滚动、更新的记录集 Y[R veF
1、创建可滚动、更新的Statement w/IYQC\v
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 04D>h0yFf
该Statement取得的ResultSet就是可滚动的 #.'0DWT\-
2、创建PreparedStatement时指定参数 !D!~4h)
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); wqk D
ResultSet.absolute(9000); %iPWg
批量更新 nQy.?*X
1、Statement idPx!
fe
Statement sm = cn.createStatement(); A,Wwt
[Qw
sm.addBatch(sql1); ;6KcX \g-
sm.addBatch(sql2); "v@Y[QI
... NTbmI$(
sm.executeBatch() ]bLI!2Kr
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~:'tp28?
2、PreparedStatement 1hp`.!3]H
PreparedStatement ps = cn.preparedStatement(sql); ?#YheML?
{ :PE{2*
ps.setXXX(1,xxx); Qz=F
nR
...
U*!q@g_
ps.addBatch(); ^a^bsKW
} |r>+\" X
ps.executeBatch(); 7 XE&[o
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 NvW`x
6<u=hhL
事务的处理 [ uU"=H|
1、关闭Connection的自动提交 kVz9}Xp"
cn.setAutoCommit(false); Yd'Fhvo8
2、执行一系列sql语句 j)xRzImu
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close lqe|1vN
Statement sm ; Y3=5J\d!a
sm = cn.createStatement(insert into user...); n("Xa#mY[
sm.executeUpdate(); lR5[UKr
sm.close(); X6)%2TwO
sm = cn.createStatement("insert into corp...); U6cpj
sm.executeUpdate(); 1j"G~TM
sm.close(); P{fT5K|
3、提交 ~"|MwR!0
cn.commit(); = >CADTU
4、如果发生异常,那么回滚 M(8dKj1+
cn.rollback();