java 数据库基本操作
e'~-`Z9-)
1、java数据库操作基本流程 Z@uTkqG)
2、几个常用的重要技巧: o9m
可滚动、更新的记录集 tIGVB+g{F
批量更新 w\o)bn
事务处理 lJ:M^.Em0
d`9W
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 pwFU2}I
1、取得数据库连接 FpdDIa
1)用DriverManager取数据库连接 /lS+J(I
例子 kfqpI
String className,url,uid,pwd; e~+(7_2
className = "oracle.jdbc.driver.OracleDriver"; =mHkXHE~:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; E7X!cm/2<
uid = "system"; m/YH^N0
pwd = "manager"; >:F,-cx<
Class.forName(className); VG<Hw{ c3r
Connection cn = DriverManager.getConnection(url,uid,pwd); k'[ S@+5
2)用jndi(java的命名和目录服务)方式 * MSBjH|
例子 0^GbpSW{
String jndi = "jdbc/db"; ;m@1Ec@*p
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); x7P([^i
DataSource ds = (DataSource) ctx.lookup(jndi); Sc1+(z
Connection cn = ds.getConnection(); >
$w^%I
多用于jsp中 ET,Q3X\Oe
2、执行sql语句 y:[BP4H ?y
1)用Statement来执行sql语句 -,~;qSs
String sql; %s$rP
Statement sm = cn.createStatement(); xl+DRPzl
sm.executeQuery(sql); // 执行数据查询语句(select) zH)cU%I@.
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2PVx++*]C
2)用PreparedStatement来执行sql语句 vix&E`0yD
String sql; 0PnD|]9:
sql = "insert into user (id,name) values (?,?)"; y4xT:G/M
PreparedStatement ps = cn.prepareStatement(sql); E /fw?7eQ
ps.setInt(1,xxx); DR
k]{^C~
ps.setString(2,xxx); -A/ds1=;
... K<@[_W+
ResultSet rs = ps.executeQuery(); // 查询 K-J|/eB
int c = ps.executeUpdate(); // 更新 La"o)L +m_
gd337jw
3、处理执行结果 \8;Qv
查询语句,返回记录集ResultSet V19e>
更新语句,返回数字,表示该更新影响的记录数 [_y9"MMwn
ResultSet的方法 .UM<a
Ik
1、next(),将游标往后移动一行,如果成功返回true;否则返回false t6'61*)|0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 D9 qX->p
Qs|OG
4、释放连接 _Kc1
cn.close(); Dh2:2Rz=#7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection IK*oFo{C=K
Y%<`;wK=^
可滚动、更新的记录集 \*f;!{P{
1、创建可滚动、更新的Statement #*!+b
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); (Ij0AeJ#
该Statement取得的ResultSet就是可滚动的 F,*2#:Ki
2、创建PreparedStatement时指定参数 z 0~j
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); x}tKewdOSe
ResultSet.absolute(9000); #|qm!aGs
批量更新 z^4KU\/JK
1、Statement ET U-]R 3
Statement sm = cn.createStatement(); zuUT S[
sm.addBatch(sql1); i]it5
sm.addBatch(sql2); <=q*N;=T,
... ZlthYuJ
sm.executeBatch() j((hqJr
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 \,>_c
2、PreparedStatement ^9&b+u=X
PreparedStatement ps = cn.preparedStatement(sql); wA?@v|,dZ
{ nIf N"
ps.setXXX(1,xxx); 'UY[ap
... ]EB6+x!G
ps.addBatch(); YecT 96%
} ?qk@cKS
ps.executeBatch(); :3JCvrq
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g[/^cJHQ
O$a#2p&
事务的处理 }l~]b3@qu
1、关闭Connection的自动提交 ; ;<J
x.
cn.setAutoCommit(false); l`SK*Bm~<
2、执行一系列sql语句 ./$
<J6-J
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 5^\m`gS
Statement sm ; $fj])>=H
sm = cn.createStatement(insert into user...); I0!j<G
sm.executeUpdate(); EPc!p>
sm.close(); fD'/#sA#'
sm = cn.createStatement("insert into corp...); XZ}de%U1
sm.executeUpdate(); `)"tO&Fn
sm.close(); lp(Nv(S
3、提交 cL#-*_(
cn.commit(); cv3L&zg M
4、如果发生异常,那么回滚 3 h#s([uL
cn.rollback();