java 数据库基本操作 O^r,H,3S
1、java数据库操作基本流程 f,VJfY?#
2、几个常用的重要技巧: XXy&1C
可滚动、更新的记录集 ]5+<Rqdbg
批量更新 R]"
jr
事务处理 h@+(VQ
&d=ZCaP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 O~c\+~5M*
1、取得数据库连接 QFU1l"(qGk
1)用DriverManager取数据库连接 "$ U!1
例子 "bA8NQIP
String className,url,uid,pwd; cIg+^Tl
className = "oracle.jdbc.driver.OracleDriver"; qsHjqK@(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; /{!?e<N>
uid = "system"; 0[R7HX-@
pwd = "manager"; w0,rFWS
Class.forName(className); O"emse}Z
Connection cn = DriverManager.getConnection(url,uid,pwd); 'a=' (,%
2)用jndi(java的命名和目录服务)方式 C%Fc%}[
例子 ,IRy.
qy
String jndi = "jdbc/db"; )26_7.|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); kz^?!l)X0
DataSource ds = (DataSource) ctx.lookup(jndi); ]L_h3Xz\X
Connection cn = ds.getConnection(); B8NMo5a
多用于jsp中 j'q Iq;y
2、执行sql语句 7i88iT
1)用Statement来执行sql语句 6$
ag<
String sql; ;`
!j~
Statement sm = cn.createStatement(); ?y2v?h"
sm.executeQuery(sql); // 执行数据查询语句(select) 1{?5/F \ +
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^ ^k]2oG
2)用PreparedStatement来执行sql语句 %ql2 XAY
String sql; Pvz\zRq
sql = "insert into user (id,name) values (?,?)"; Qn`Fq,uvL
PreparedStatement ps = cn.prepareStatement(sql); v|wO qS
ps.setInt(1,xxx); gJ?Vk<hp
ps.setString(2,xxx); M"E7=J
... oNp(GQ@0
ResultSet rs = ps.executeQuery(); // 查询 c3C<P
int c = ps.executeUpdate(); // 更新 MXrh[QCU)
7
|Q;E|=-Y
3、处理执行结果 LIfYpn6
查询语句,返回记录集ResultSet fu{.Ir
更新语句,返回数字,表示该更新影响的记录数 ~c${?uf
ResultSet的方法 {J]x81}*;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7(B"3qF8|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 M1J77LfS8
a$]i8AeG
4、释放连接 jn+BH3e
cn.close(); Bb*P);#.K
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u9D#5NvGs
>_SqM! ^v
可滚动、更新的记录集 TgvBy
1、创建可滚动、更新的Statement s'=w/os
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |6!L\/}M%
该Statement取得的ResultSet就是可滚动的 0%"sOth
2、创建PreparedStatement时指定参数 @Q%<~b[y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (!0fmL
ResultSet.absolute(9000); ,g:\8*Y>'
批量更新 8"C[sRhz
1、Statement #pr{tL
Statement sm = cn.createStatement(); y\zRv(T=
sm.addBatch(sql1); -gVsOX0
sm.addBatch(sql2); OpFm:j3
... B-W8Zq#4>
sm.executeBatch() @h!nVf%fe
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /7hC
/!@
2、PreparedStatement 'ARbJ1a
PreparedStatement ps = cn.preparedStatement(sql); o>Q=V0?
{ OtZc;c
ps.setXXX(1,xxx); ;ji["b
... r"&VG2c0K
ps.addBatch(); % jSB9
} CC,CKb
ps.executeBatch(); DgODTxiX
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 N~+ e\K6
C(}N*e1
事务的处理 w=QW8q?
1、关闭Connection的自动提交 Zx 5Ue#I
cn.setAutoCommit(false); t>JPK_b0
2、执行一系列sql语句 -;j
'=?
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 69$gPY'3
Statement sm ; y8$I=
sm = cn.createStatement(insert into user...); `}S;_g!
sm.executeUpdate(); H,0Io
sm.close(); h Nx#x
sm = cn.createStatement("insert into corp...); 1s6L]&B
sm.executeUpdate(); XxLauJP
K
sm.close(); Y|~+bKa
3、提交 ;-6
cn.commit(); kn&>4/')
4、如果发生异常,那么回滚 T1i}D"H %
cn.rollback();