java 数据库基本操作 vkYiO]y
1、java数据库操作基本流程 sQrM"i0Y>
2、几个常用的重要技巧: ,k@iNid
可滚动、更新的记录集
"ZNy*.G|[
批量更新 ?<
Ma4yl</
事务处理 3F6A.Ny
d[H`Fe6h
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 X$%W&:
1、取得数据库连接 L&|^y8
1)用DriverManager取数据库连接 `6NcE-oJ
例子 EuVA"~PA
String className,url,uid,pwd; *|6vCR
className = "oracle.jdbc.driver.OracleDriver"; cs: ?Wq ^
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; I~ mu'T
uid = "system"; nI73E
pwd = "manager"; r4?|sAK
Class.forName(className); pma=*
Connection cn = DriverManager.getConnection(url,uid,pwd); R$eEW"]
2)用jndi(java的命名和目录服务)方式 7coVl$_Zl
例子 zqXDD; w3
String jndi = "jdbc/db"; r#}o
+3*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); =
~*Vfx
DataSource ds = (DataSource) ctx.lookup(jndi); u<Ch]m+
Connection cn = ds.getConnection(); &I{5f-o*
多用于jsp中 6 pQo_l}
2、执行sql语句 t="nmjQs
1)用Statement来执行sql语句 OSJj^Y)W|
String sql; AOqL&z
Statement sm = cn.createStatement(); fCO<-L9k$
sm.executeQuery(sql); // 执行数据查询语句(select) 5@W63!N
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @6;ZP1
2)用PreparedStatement来执行sql语句 0uGTc[^^M
String sql; cp`ZeLz2^
sql = "insert into user (id,name) values (?,?)"; BuitM|k'
PreparedStatement ps = cn.prepareStatement(sql); rNke&z:%X_
ps.setInt(1,xxx); @!!5el {
ps.setString(2,xxx); Smh=Q4,W
... $p}q,f.
ResultSet rs = ps.executeQuery(); // 查询 E;k$ICOXA
int c = ps.executeUpdate(); // 更新 }1a(*s,s-^
XZTH[#MqeI
3、处理执行结果 ':=20V
查询语句,返回记录集ResultSet m.5@qmQ
更新语句,返回数字,表示该更新影响的记录数 eG dFupfz
ResultSet的方法 ).tTDZ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false h>z5m
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 tC/+
)2jH&}K
4、释放连接 wr>6Go%
cn.close(); 'OU3-K
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection :$XlYJrjK
-<u_fv
可滚动、更新的记录集 gEgd/Le
1、创建可滚动、更新的Statement 5RF*c,cNq
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); BISH34
该Statement取得的ResultSet就是可滚动的 =""5
c
2、创建PreparedStatement时指定参数 je%y9*V
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); p~-)6)We?
ResultSet.absolute(9000); QZL,zI]LL
批量更新 j0=H6Y
1、Statement 9`&sZ|"3
Statement sm = cn.createStatement(); "SC]G22
sm.addBatch(sql1); 7PO]\X^(zE
sm.addBatch(sql2); <c,iu{:
... 6>'>BamX
sm.executeBatch() UnZc9 6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 W yP] ]I.
2、PreparedStatement zTn.#-7y
PreparedStatement ps = cn.preparedStatement(sql); SEM-t
{ Pn?gB}l
ps.setXXX(1,xxx); }JUc!cH8z
... ,OkI0[
ps.addBatch(); GN+,9
} n(Um/
ps.executeBatch(); sr<\fW
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 PFbkkQKsT
++|e
z{
事务的处理 btDTC9O
1、关闭Connection的自动提交 Izfq`zS+\s
cn.setAutoCommit(false); O? 7hT!{
2、执行一系列sql语句 [XP\WG>s
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close gU@R
Statement sm ; Iqj?wI1)
sm = cn.createStatement(insert into user...); D3+<16[,
sm.executeUpdate(); +}f}!h;
sm.close(); h;OHpvk
sm = cn.createStatement("insert into corp...); T!1XL7
sm.executeUpdate(); 1CUI6@Cz)
sm.close(); @G|z_
3、提交 8K\S]SZ
cn.commit(); ogdgLTi
4、如果发生异常,那么回滚 - C8VDjf9
cn.rollback();