java 数据库基本操作 _mw13jcN]
1、java数据库操作基本流程 ~;}\zKQKE
2、几个常用的重要技巧: 2y^Uk,g
可滚动、更新的记录集 "=9-i-K9B
批量更新 buRhQ"
事务处理 ]9fS@SHdx
S2Zx &D/_
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 l &}piC
1、取得数据库连接 ';_1rh
1)用DriverManager取数据库连接 SrSG{/{
例子 '^hsH1
String className,url,uid,pwd; s5Pq$<
className = "oracle.jdbc.driver.OracleDriver"; -y%QRO(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; j0AwL7
uid = "system"; Pl_^nFm0
pwd = "manager"; !syU]Yk
Class.forName(className); :){)JZ}-95
Connection cn = DriverManager.getConnection(url,uid,pwd); ,cLH*@
2)用jndi(java的命名和目录服务)方式 Og+)J9#
例子 ol50d73B
String jndi = "jdbc/db"; ya#RII']
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); E\ tL
DataSource ds = (DataSource) ctx.lookup(jndi); iM8sX
B
Connection cn = ds.getConnection(); 8IeI0f"l)
多用于jsp中 kl=xu3j
2、执行sql语句 [@ILc*2O
1)用Statement来执行sql语句 V)=Z6 ti
String sql; |ribWCv0
Statement sm = cn.createStatement(); cbfDB^_
sm.executeQuery(sql); // 执行数据查询语句(select) \]t]#D>0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); AHq M7+r9
2)用PreparedStatement来执行sql语句 (9E( Q*J5x
String sql; X2LV&oi
sql = "insert into user (id,name) values (?,?)"; ]{<saAmJC
PreparedStatement ps = cn.prepareStatement(sql); { E^U6@
ps.setInt(1,xxx); 36nyu_h:R
ps.setString(2,xxx);
P`tyBe#=
... 0fA=_=A,
ResultSet rs = ps.executeQuery(); // 查询 9YAM#LBTWi
int c = ps.executeUpdate(); // 更新 '(tj[&aL
v_.HGGS
3、处理执行结果 Vn^)
查询语句,返回记录集ResultSet w~]T<^fW~
更新语句,返回数字,表示该更新影响的记录数 oooS s&t
ResultSet的方法 Z0aUHWms
1、next(),将游标往后移动一行,如果成功返回true;否则返回false c+~LpSQ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Q<1L`_.>
X~Cq
4、释放连接 qIz}$%!A
cn.close(); ]W;:|/,c
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection CG.,/]_
%Uf'+!4l`
可滚动、更新的记录集 ##v`(#fu
1、创建可滚动、更新的Statement 0iV;g`%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *Z; r
B
该Statement取得的ResultSet就是可滚动的 <*_o0;h|
2、创建PreparedStatement时指定参数 XC2FF&B&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); &8n?
ResultSet.absolute(9000); C s#w72N
批量更新 -R :X<eb
1、Statement ctHEEFWm
Statement sm = cn.createStatement(); &atyDFJ'
sm.addBatch(sql1); 0yaMe@&,
sm.addBatch(sql2); C B/r]+4
... FfG%C>E6~
sm.executeBatch() 6A?8tm/0
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Lc%xc`n8B
2、PreparedStatement p31oL{D
PreparedStatement ps = cn.preparedStatement(sql); (-(QDRxK
{ 8ljuc5,J
ps.setXXX(1,xxx); o<rsAe
... (0R2T"/
ps.addBatch(); `BjR.xMv
} X8Fzs!L`
ps.executeBatch(); :v)6gz(p
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 xCq'[9oU
NH4?q!'G
事务的处理 n]iyFZ`9
1、关闭Connection的自动提交 5z Kqb
cn.setAutoCommit(false); R5ZIC4p
2、执行一系列sql语句 N2Ssf$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close j8a[
(
Statement sm ; *V DVC0R
sm = cn.createStatement(insert into user...); MMd.0JuaO
sm.executeUpdate(); qnXTNs
?b
sm.close(); ?-,6<K1
sm = cn.createStatement("insert into corp...); AG>\aV"b
sm.executeUpdate(); `[Sl1saZ$S
sm.close(); ?oKL&I@
3、提交 =?/&u<
cn.commit(); 95LyYg
4、如果发生异常,那么回滚 ]]PE#DDg
cn.rollback();