java 数据库基本操作 =5J}CPKbZI
1、java数据库操作基本流程 54v}iG
2、几个常用的重要技巧: xzh`q
可滚动、更新的记录集 X$)<>e]!>
批量更新 bDK72cQ
事务处理 Rjt]^gb!*
YB*I'm3q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :hC+r=!I
1、取得数据库连接 l%L..WCT]
1)用DriverManager取数据库连接 cJ=0zEv
例子 x:4:G(
String className,url,uid,pwd; <A<N? `"
className = "oracle.jdbc.driver.OracleDriver"; /d*d'3{c
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; N
8 n`f
uid = "system"; ^O}` i
pwd = "manager"; )CKPzNf
Class.forName(className); "=@X>jUc
Connection cn = DriverManager.getConnection(url,uid,pwd); O!#r2Y"?K1
2)用jndi(java的命名和目录服务)方式 '| WY 2>/(
例子 ;Lr]w8d
String jndi = "jdbc/db"; B^nE^"b
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *d b,N'rK
DataSource ds = (DataSource) ctx.lookup(jndi); v;1<K@UT
Connection cn = ds.getConnection(); 5 Sl vCL
多用于jsp中 BS!VAHO"V
2、执行sql语句 V^apDV\AV
1)用Statement来执行sql语句 /6 QwV->
String sql; *>
LA30R*v
Statement sm = cn.createStatement(); l$
^LY)i
sm.executeQuery(sql); // 执行数据查询语句(select) $b OiP
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); x}B3h9]
2)用PreparedStatement来执行sql语句 0o7*5| T4
String sql; opqY@>Vh&
sql = "insert into user (id,name) values (?,?)"; Y`3V&8X
PreparedStatement ps = cn.prepareStatement(sql); 8#L
V
oR
ps.setInt(1,xxx); vY)5<z&
ps.setString(2,xxx); *3
8
u ~n
... n<3qr}ZG^
ResultSet rs = ps.executeQuery(); // 查询 RzhAXI=
int c = ps.executeUpdate(); // 更新 #g=7fu{n:
wwaw|$
3、处理执行结果 h9RL(Kq{
查询语句,返回记录集ResultSet 0 7b=Zhh
更新语句,返回数字,表示该更新影响的记录数 &PZ&'N|P
ResultSet的方法 P.aN4 9`=
1、next(),将游标往后移动一行,如果成功返回true;否则返回false eCFMWFhC
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 maTQ0GX
4 ))Z Bq?
4、释放连接 ;S0Kf{DN2
cn.close(); JCFiKt9n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Dk%+|c
2fN2!OT
可滚动、更新的记录集 P8[rp
1、创建可滚动、更新的Statement m55|&Ux|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6--t6>5
该Statement取得的ResultSet就是可滚动的 \w#)uYK{i_
2、创建PreparedStatement时指定参数 +adwEYRrr
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); FNlS)Bs
ResultSet.absolute(9000); '-X[T}
批量更新 ?*LVn~y
1、Statement ~
kwS`
Statement sm = cn.createStatement(); }iIZA>eF
sm.addBatch(sql1); _59f.FsVR
sm.addBatch(sql2); #K&XY6cTj
... )[wB:kG
sm.executeBatch() ]}4JT
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H Q :Y:
2、PreparedStatement \~X:ffb =
PreparedStatement ps = cn.preparedStatement(sql); #fy3i+
{ :_k5[KT.]9
ps.setXXX(1,xxx); \:-"?
... /L{V3}[j
ps.addBatch(); 7D&O5Z=%+
} FRhHp(0}5
ps.executeBatch(); t03X/%H
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3FY87R
j[CXIz?c
事务的处理 <c3Te$.
1、关闭Connection的自动提交 y=!7PB_\|
cn.setAutoCommit(false); %\^VxM
2、执行一系列sql语句 L;h|Sk]{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close fDjJdRS"
Statement sm ; %-fQ[@5
sm = cn.createStatement(insert into user...); jZr"d*Y
sm.executeUpdate(); 7?ICXhu9
sm.close(); UMUG~P&@
sm = cn.createStatement("insert into corp...); TrPw*4h 9s
sm.executeUpdate(); +?)R}\\
sm.close(); #(7^V y&
3、提交 'pj*6t1~
cn.commit(); <P~pn!F}
4、如果发生异常,那么回滚 vN&(__3((
cn.rollback();