java 数据库基本操作 d=:&tOCg2
1、java数据库操作基本流程 9h'klaE(
2、几个常用的重要技巧: }t.VH:02y
可滚动、更新的记录集 D(Yq<%Q
批量更新 3,{tGNl|
事务处理 6Er%td)f
\:91BQP
c
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ]73BJ
1、取得数据库连接 VTxLBFK;
1)用DriverManager取数据库连接 qGKQrb,K
例子 FrD,)Ad8Q
String className,url,uid,pwd; ahm@ +/2
className = "oracle.jdbc.driver.OracleDriver"; LxxFosi8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Fd@:*ER
uid = "system"; Ov9kD0S
pwd = "manager"; D[R<H((
Class.forName(className); xnG,1doa
Connection cn = DriverManager.getConnection(url,uid,pwd); V7i1BR8G
2)用jndi(java的命名和目录服务)方式 ""^.fh
例子 0Xw3h^%
String jndi = "jdbc/db"; $5a%hK
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 7eekTh, ?
DataSource ds = (DataSource) ctx.lookup(jndi); U^{'"x+
Connection cn = ds.getConnection(); I4^}C;p0?
多用于jsp中 $NhKqA`0
2、执行sql语句 ;&G8e*bM2
1)用Statement来执行sql语句 +BE_K_56
String sql; C~a-R#
Statement sm = cn.createStatement(); \%N |
X
sm.executeQuery(sql); // 执行数据查询语句(select) p*Hbc|?{Q&
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); X?Mc"M
2)用PreparedStatement来执行sql语句 bol#[_~
String sql; ]o\y(!
sql = "insert into user (id,name) values (?,?)"; x?MSHOia`P
PreparedStatement ps = cn.prepareStatement(sql); Mlr}v^"G
ps.setInt(1,xxx); zE\@x+k.
ps.setString(2,xxx); U m9]X@z
... O8%Y .SK
ResultSet rs = ps.executeQuery(); // 查询 >E`p@
e+
int c = ps.executeUpdate(); // 更新 9K5[a^q|My
@( H
3、处理执行结果 =~~Y@eX
查询语句,返回记录集ResultSet RAW(lZ(
更新语句,返回数字,表示该更新影响的记录数 FUj4y 9X
ResultSet的方法 {^VvL'n
1、next(),将游标往后移动一行,如果成功返回true;否则返回false z`[q$H7?
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 TGe{NUO
{Jl W1;Jc7
4、释放连接 -w:F8k ~
cn.close(); *k#M;e
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
=+j>?Yi
*PjW,
可滚动、更新的记录集 aD:vNX
1、创建可滚动、更新的Statement KW.QVBuVO#
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); (C
EXPf
该Statement取得的ResultSet就是可滚动的 30v 3C7o=
2、创建PreparedStatement时指定参数 uZ(j"y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); vQpR0IEf]e
ResultSet.absolute(9000); idr,s\$>
批量更新 `Vqpo/
1、Statement aGY F\7
Statement sm = cn.createStatement(); 51k^?5cO
sm.addBatch(sql1); F!;0eS"xp
sm.addBatch(sql2); |Skk1#
... 9ZEF%&58Y
sm.executeBatch() //}[(9b'\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 O8N\
2、PreparedStatement Xbb('MoI63
PreparedStatement ps = cn.preparedStatement(sql); 1>SCY_Cv
{ ~"+Fp&[9f
ps.setXXX(1,xxx); 9\]%N;;Lo
... 1MCHwX3/
ps.addBatch(); . 787+J?
} AZCbUkq
ps.executeBatch(); )TBG-<wt
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \e/'d~F
XHu2G t_
事务的处理 t$z
FsFTQ
1、关闭Connection的自动提交 D$RQD{*
cn.setAutoCommit(false); u8Au `
2、执行一系列sql语句 idf~"a
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^rc!X]C9
Statement sm ; !v2D 18(
sm = cn.createStatement(insert into user...); q.OkZI0n
sm.executeUpdate(); Et=N`k_gO
sm.close(); FSqS]6b3
sm = cn.createStatement("insert into corp...); 5]&vs!wH
sm.executeUpdate(); =_`4HDr
sm.close(); .1.Bf26}d
3、提交 8S>T1st
cn.commit(); 5CxD ys&<
4、如果发生异常,那么回滚 &r6VF/
cn.rollback();