java 数据库基本操作 )8eb(!}7
1、java数据库操作基本流程 5GgH6
2、几个常用的重要技巧: qO8:|q1%;\
可滚动、更新的记录集 3A[<LnKR^E
批量更新 5 r_Z3/%
事务处理 5M~nNm[xJU
Ovj^
7r:<s
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Eu"8IM!%-
1、取得数据库连接 +]( y
1)用DriverManager取数据库连接 E{e
例子 @1gURx&2_
String className,url,uid,pwd; \>}#[?y
className = "oracle.jdbc.driver.OracleDriver"; zS|4@t\__
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Njr;Wa.r+
uid = "system";
N-&ZaK
pwd = "manager"; ]jn1T^D'
Class.forName(className); <6Y;VH^_
Connection cn = DriverManager.getConnection(url,uid,pwd); &Xh> w(u
2)用jndi(java的命名和目录服务)方式 TU2oQ1
例子 _KkaseR
String jndi = "jdbc/db"; z07&P;W!{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); =3A4.nW
DataSource ds = (DataSource) ctx.lookup(jndi); c2,g%(
Connection cn = ds.getConnection(); E8"&gblg
多用于jsp中 5#N<~
2、执行sql语句 +>;Ux1'@
1)用Statement来执行sql语句 @>.aQE
String sql; !L
q'o?
Statement sm = cn.createStatement(); JhwHsx/
sm.executeQuery(sql); // 执行数据查询语句(select) V_D wHq2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); DTM(SN8R+n
2)用PreparedStatement来执行sql语句 $d])>4eQ
String sql; a#% *H
sql = "insert into user (id,name) values (?,?)"; D.%%D%AdB
PreparedStatement ps = cn.prepareStatement(sql); &!O?h/&X3
ps.setInt(1,xxx); ZWGX*F#}P
ps.setString(2,xxx); MN5}}@
... k\;D;e{
ResultSet rs = ps.executeQuery(); // 查询 mAGD qz>f
int c = ps.executeUpdate(); // 更新 lo'#dpt<
zTfjuI|R
3、处理执行结果 0zT-]0
查询语句,返回记录集ResultSet 5mpql[v3P
更新语句,返回数字,表示该更新影响的记录数 -3~S{)
ResultSet的方法 He5y;5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =q)+_@24>d
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 UR=s=G|
W2h4ej\s
4、释放连接 Vn:v{-i
cn.close(); \9tJ/~
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +;,J0,Yn
WQ.{Ag?1
可滚动、更新的记录集 t?)]xS)
1、创建可滚动、更新的Statement %mU$]^Tw(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1@ &J"*
该Statement取得的ResultSet就是可滚动的 dmv0hof
2、创建PreparedStatement时指定参数 =54D#,[B
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); hCF_pt+
ResultSet.absolute(9000); F%&lM[N%
批量更新 jPZ+~:m+
1、Statement EA1&D^nT
Statement sm = cn.createStatement(); ss }-YnG
sm.addBatch(sql1); `v)'(R7){
sm.addBatch(sql2); &8Vh3QLEx
... R@NFpiw
sm.executeBatch() D]aQt%TL
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~"vS$>+
2、PreparedStatement 'nh2}
PreparedStatement ps = cn.preparedStatement(sql); "(p /3qFY
{ 7 kA+F+f
ps.setXXX(1,xxx); ~vA8I#.
... zjcSn7iu
ps.addBatch(); f{O-\
} KehM.c^
ps.executeBatch(); ar,v/l>d4N
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 SFtcO
LEtGrA/%@b
事务的处理 O43"-
1、关闭Connection的自动提交 R[m{"2|,Lc
cn.setAutoCommit(false); w6h83m
3
2、执行一系列sql语句 H Q[
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close <oT1&C{
Statement sm ; B6TE9IoSb8
sm = cn.createStatement(insert into user...); 5{+2#-
sm.executeUpdate(); }:{ @nP
sm.close(); YT'V/8US
sm = cn.createStatement("insert into corp...); v?6*n>R
sm.executeUpdate(); KaOXqFT=
sm.close(); $|&<cenMT
3、提交 O/ItN5B
;
cn.commit(); "s]
4、如果发生异常,那么回滚 7BwR ].
cn.rollback();