java 数据库基本操作 #MhNdH#
1、java数据库操作基本流程 $PatHY@h
2、几个常用的重要技巧: Tn4W\?R
可滚动、更新的记录集 $z2xZqe
批量更新 "ib K1}-
事务处理 [Krm .)
t4f
(Y,v
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 zB#_:(1qK
1、取得数据库连接 LyuSZa]
1)用DriverManager取数据库连接 MekT?KPQ{L
例子 (
oQ'4,F
String className,url,uid,pwd; N{1.gS
className = "oracle.jdbc.driver.OracleDriver"; t(J![wB}
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0Y5LDP
uid = "system"; v%H"_T
pwd = "manager"; Jh37pI
Class.forName(className); mJ0}DJiX$
Connection cn = DriverManager.getConnection(url,uid,pwd); ZR!cQ oV=
2)用jndi(java的命名和目录服务)方式 OLk9A
例子 3)6+1Yc
String jndi = "jdbc/db"; %^a]J"Ydi8
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); L!bfh`
DataSource ds = (DataSource) ctx.lookup(jndi); =oo[ Eyr
Connection cn = ds.getConnection(); $R A4U<
多用于jsp中 tt+>8rxF:;
2、执行sql语句 .abyYVrN4?
1)用Statement来执行sql语句 /hm84La
String sql; dV5PhP>6
Statement sm = cn.createStatement(); 'ox0o:
sm.executeQuery(sql); // 执行数据查询语句(select) [kPD`be2#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); QuSV&>T\
2)用PreparedStatement来执行sql语句 8g<Q5(
String sql; ?!bd!:(N
sql = "insert into user (id,name) values (?,?)"; vC)"*wYB{
PreparedStatement ps = cn.prepareStatement(sql); |RR"'o_E
ps.setInt(1,xxx); ~hS3*\^~M
ps.setString(2,xxx); ;Ay>+M2O
... ~A^E
ResultSet rs = ps.executeQuery(); // 查询 G;2R]H#p
int c = ps.executeUpdate(); // 更新 -Nsk}Rnk*
mSU@UD|'
3、处理执行结果 C-Nuy1o
查询语句,返回记录集ResultSet SV$nyV
更新语句,返回数字,表示该更新影响的记录数 TRF]i/Bs
ResultSet的方法 O!:QJ
^8d
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &}vR(y*#c
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 r0)JUc}Fyq
8 ne/=N|,
4、释放连接 gO+\O
cn.close(); ~c9>Nr9|`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection j(0Ilx|7v
cwk+#ur
可滚动、更新的记录集 uzHT.iBn
1、创建可滚动、更新的Statement YSqv86
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *,"jF!C&[
该Statement取得的ResultSet就是可滚动的 By2s ']bw
2、创建PreparedStatement时指定参数 7sXy`+TZ->
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); j'3j}G%\T
ResultSet.absolute(9000); ec`bz "1
批量更新 ,%A)"doaG
1、Statement *R5`.j =
Statement sm = cn.createStatement(); t(}/g
sm.addBatch(sql1); A[RHw<
sm.addBatch(sql2); GHv{
... Vd,' s
sm.executeBatch() 7e1dEgn
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 z<a$q3!#
2、PreparedStatement I`22Zwq:
PreparedStatement ps = cn.preparedStatement(sql); T36x=LX
{ 8QT<M]N%
ps.setXXX(1,xxx); St6aYK
... C`dkD0_
ps.addBatch(); ( :
} B9YsA?hg
ps.executeBatch(); BY3bpR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {1jpLdCbV^
vwVVBG;t
事务的处理 yB.G=90
1、关闭Connection的自动提交 IrJ+Jov
cn.setAutoCommit(false); gdl| ^*tc
2、执行一系列sql语句 Ski G2n]
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 0|ZVA+
Statement sm ; {{32jU7<
sm = cn.createStatement(insert into user...); H#+\nT2m
sm.executeUpdate(); jk )Vb
sm.close(); q %>7L<r
sm = cn.createStatement("insert into corp...); @|BD|{k
sm.executeUpdate(); uG;?vvg>
sm.close(); 4:D:| r
3、提交 [cDbaq,T
cn.commit(); b \:~ ;
4、如果发生异常,那么回滚 ZP-dW|<[x
cn.rollback();