java 数据库基本操作 _P^ xX'v
1、java数据库操作基本流程 dx/NY1
2、几个常用的重要技巧: 'aW}&!H M
可滚动、更新的记录集 6lp.0B
批量更新 qs["&\@
事务处理 TQor-Cymz
'@{'T LMCi
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 2feiD?0
1、取得数据库连接 3M?vK(zG>P
1)用DriverManager取数据库连接 c]u^0X?&
例子 "JH
/ODm
String className,url,uid,pwd; LW"p/`#<
className = "oracle.jdbc.driver.OracleDriver"; Id<3'ky<N
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 'S[&-D%(3
uid = "system"; L~WC9xguDl
pwd = "manager"; 1ymq7F(2
Class.forName(className); _o'3v=5T
Connection cn = DriverManager.getConnection(url,uid,pwd); 7sC8|+
2)用jndi(java的命名和目录服务)方式 $@ous4&
例子 uT#MVv~ .
String jndi = "jdbc/db"; )[w_LHKI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); xu]>TC1
DataSource ds = (DataSource) ctx.lookup(jndi); U{)|z-n
Connection cn = ds.getConnection(); BEm~o#D
多用于jsp中 I^CKq?V?:
2、执行sql语句 K+`$*vS~ws
1)用Statement来执行sql语句 gz,x6mnQ
String sql; ~> xVhd
Statement sm = cn.createStatement(); =:4vRq
[
sm.executeQuery(sql); // 执行数据查询语句(select) ^GyGh{@,f
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $bGe1\
2)用PreparedStatement来执行sql语句 kVH^(Pi
String sql; r"%uP[H
sql = "insert into user (id,name) values (?,?)"; UP8=V>T02
PreparedStatement ps = cn.prepareStatement(sql); h
rksPK"s2
ps.setInt(1,xxx); MFHc>O
DA
ps.setString(2,xxx); !9n!:"(r
... N?RJuDW
ResultSet rs = ps.executeQuery(); // 查询 ]+OHxCj:
int c = ps.executeUpdate(); // 更新 hj8S".A_
A `H&"A
3、处理执行结果 ]tu:V,q
查询语句,返回记录集ResultSet o#X=1us
更新语句,返回数字,表示该更新影响的记录数 uTX0lu;
ResultSet的方法 Nydhal00
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &3o[^_Ti
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |x
Nd^
7jf%-X
4、释放连接 DKvNQ:fI>9
cn.close(); 6G6B!x
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection f19~B[a
ssWSY(j]
可滚动、更新的记录集 x}c%8dO#J
1、创建可滚动、更新的Statement F1q a`j^'
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *<5zMSZO
该Statement取得的ResultSet就是可滚动的 _(TYR*
2、创建PreparedStatement时指定参数 SviGLv;oR
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #nzVgV]
ResultSet.absolute(9000); g4`)n`
批量更新 <+/:}S4w)
1、Statement /.Fvl;!J;
Statement sm = cn.createStatement(); ,pg\5b
sm.addBatch(sql1); Uc?4!{$X
sm.addBatch(sql2);
JyfWy
... Xyf7sHQ
sm.executeBatch() RH"&B`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 .;:jGe(
2、PreparedStatement OE"r=is
PreparedStatement ps = cn.preparedStatement(sql); FTA[O.tiG
{ |.q K69
ps.setXXX(1,xxx); :.K#=ROP
... 1Ar6hA
ps.addBatch(); knPo"GQW
} :We}l;.jQ
ps.executeBatch(); lwhVP$q}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Z,? T`[4B
6pKb!JJ
事务的处理 !R`)S7!
1、关闭Connection的自动提交 w|;kL{(W
cn.setAutoCommit(false); S>'S4MJE`
2、执行一系列sql语句 _kJ?mTk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close p?#cn
Statement sm ; DH5]Kzb/
sm = cn.createStatement(insert into user...); c'678!r9 P
sm.executeUpdate(); m V U(b,
sm.close(); W8/8V,
sm = cn.createStatement("insert into corp...); S]P80|!|
sm.executeUpdate(); 0D\b;ju<
sm.close(); v)TFpV6b{p
3、提交 EZz`pE
cn.commit(); }EW@/; kC
4、如果发生异常,那么回滚 ,%L>TD'48s
cn.rollback();