java 数据库基本操作
^XjvJa
1、java数据库操作基本流程 3<V.6'*k
2、几个常用的重要技巧: 1q;I7_{ 2
可滚动、更新的记录集 853]CK<
批量更新 +_vm\]4
事务处理 pO-)x:Wg
~:'gvR;x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 J
tn&o"C
1、取得数据库连接 Gl3 `e&7
1)用DriverManager取数据库连接 ee__3>H"/
例子 $i5G7b
String className,url,uid,pwd; s.k`];wo
className = "oracle.jdbc.driver.OracleDriver"; _rWTw+
L
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; x`j_d:C~G
uid = "system"; AmUe0CQ:k'
pwd = "manager"; K6PC&+x
Class.forName(className); 8trm`?>
Connection cn = DriverManager.getConnection(url,uid,pwd); bCe[nmE2
2)用jndi(java的命名和目录服务)方式 \oD=X}UQw(
例子 x3:ZB
String jndi = "jdbc/db"; z{<q0.^EFh
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Lx4H/[$6D
DataSource ds = (DataSource) ctx.lookup(jndi); l,~ N~?
Connection cn = ds.getConnection(); o
=jX
多用于jsp中 5VY%o8xXa
2、执行sql语句 zmrX%!CW
1)用Statement来执行sql语句 Y6[] wUJ
String sql; HzFt
Statement sm = cn.createStatement(); m-&a~l
sm.executeQuery(sql); // 执行数据查询语句(select) $)WH^Ir~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 'PxL^
2)用PreparedStatement来执行sql语句 d@`-!"
String sql; qrORP3D@
sql = "insert into user (id,name) values (?,?)"; <3J=;.\6
PreparedStatement ps = cn.prepareStatement(sql); d-_93
ps.setInt(1,xxx); 7ZR0M&pX
ps.setString(2,xxx); rK0|9^i{
... {#d`&]
ResultSet rs = ps.executeQuery(); // 查询 Jf8'N
ot
int c = ps.executeUpdate(); // 更新 &El[
u8$~N$L
3、处理执行结果 0Zp<=\!;
查询语句,返回记录集ResultSet
.*clY
更新语句,返回数字,表示该更新影响的记录数 42H#n]Y
ResultSet的方法 N-_| %C-.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false g*\v}6
h
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 pB{ f-M:D
b_"V%<I
4、释放连接 )G F
cn.close(); 07E".T%Ts
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection _^,[wD
RvZryA*vu
可滚动、更新的记录集 +eVpMD(
l
1、创建可滚动、更新的Statement `cy"-CJS
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); J>&dWKM3
该Statement取得的ResultSet就是可滚动的 d&3I>E$UP
2、创建PreparedStatement时指定参数 hKH
Q!`&v
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !'UsC6Y4
ResultSet.absolute(9000); wMR[*I/
批量更新 vzgudxG'z
1、Statement v6,
o/3Ex
Statement sm = cn.createStatement(); %%H. &*i,
sm.addBatch(sql1); *?
orK o
sm.addBatch(sql2); M KE[Yb?
... FCw
VVF0y
sm.executeBatch() q'U-{~q%
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /E1c#@
2、PreparedStatement 6CzvRvA*P
PreparedStatement ps = cn.preparedStatement(sql); ,4?|}xg
{ R,k[Kh
ps.setXXX(1,xxx); ^SelqX
... 6!Ap;O^*
ps.addBatch(); {:q9:
} %#;(]7Zq
ps.executeBatch(); " kJWWR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 `5aypJf1
eWt>^]H~
事务的处理 \6PIw-)
1、关闭Connection的自动提交 g\mrRZ/?
cn.setAutoCommit(false); SGT-B.
2、执行一系列sql语句 1=cfk#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^a0-5
Statement sm ; &|,qsDK(
sm = cn.createStatement(insert into user...); OA5md9P;d
sm.executeUpdate(); 97@?QI}
sm.close(); QSQ\@h;E
sm = cn.createStatement("insert into corp...); k>@^M]%
sm.executeUpdate(); $1`t+0^k
sm.close(); lKD<
3、提交 mf_9O
cn.commit(); L.~]qs|G/K
4、如果发生异常,那么回滚 7D1`^,?
cn.rollback();