java 数据库基本操作 IEdC
_6G
1、java数据库操作基本流程 U%ce0z
2、几个常用的重要技巧: !Ljs9 =UF
可滚动、更新的记录集 N
G1]!Vz5
批量更新 gO?+:}!
事务处理 Mu18s}
hFP$MFab
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 S?%V o* Y
1、取得数据库连接 50(/LV1
1)用DriverManager取数据库连接 4em7PmT
例子 vfJ}t#%UH
String className,url,uid,pwd; Ix%h/=I
className = "oracle.jdbc.driver.OracleDriver"; LKG],1n-
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; FK{YRt
uid = "system"; G.O0*E2V
pwd = "manager"; 0,(U_+n
Class.forName(className); 0%}$@H5i
Connection cn = DriverManager.getConnection(url,uid,pwd); zGu(y@o
2)用jndi(java的命名和目录服务)方式 C8y 3T/G
例子 [zK|OMxoV
String jndi = "jdbc/db"; hZ.Sj~>7`
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _Q/D%7[pa
DataSource ds = (DataSource) ctx.lookup(jndi); (^Xp\dyZL
Connection cn = ds.getConnection(); ,qpn4`zE~
多用于jsp中 ,-t3gc1~X
2、执行sql语句 J
/'woc
1)用Statement来执行sql语句 $g
_h9L
String sql; AL}c-#GG
Statement sm = cn.createStatement(); [bJ/$A
sm.executeQuery(sql); // 执行数据查询语句(select) X4&{/;$
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); y yrCO"eh
2)用PreparedStatement来执行sql语句 Y*3qH]
String sql; bmc1S
sql = "insert into user (id,name) values (?,?)"; 7(eWBJfTo
PreparedStatement ps = cn.prepareStatement(sql); f!*b8ND^R
ps.setInt(1,xxx); 5SK{^hw
ps.setString(2,xxx); ,Z#t-?
... \*!?\Ko`W
ResultSet rs = ps.executeQuery(); // 查询 QR'"Zw&q5/
int c = ps.executeUpdate(); // 更新 EKk~~PhW 8
{.z2n>1J{T
3、处理执行结果 AShJtxxa
查询语句,返回记录集ResultSet tz&=v,_jc
更新语句,返回数字,表示该更新影响的记录数 \^?BC;s^C
ResultSet的方法 }?#<)|_5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9IMtqL&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 0kpRvdEr-
?)7uwJsH
4、释放连接 RP7e)?5$s
cn.close(); x';6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <[?oP[ j
9C$b^wHd
可滚动、更新的记录集 8=T;R&U^M
1、创建可滚动、更新的Statement _+%-WFS|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); xg'z_W
该Statement取得的ResultSet就是可滚动的 D<#+ R"
2、创建PreparedStatement时指定参数 `.Y["f
1B
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Mvrc[s+o
ResultSet.absolute(9000); F^IYx~:
批量更新 C!B2.:ja
1、Statement -Uq I=#
Statement sm = cn.createStatement(); +e%9P%[+
sm.addBatch(sql1); Tm_AoZH
sm.addBatch(sql2); sZPPS&KoP3
... /lm;.7_J+
sm.executeBatch()
K-)_1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 7h<Q{X<A
2、PreparedStatement
6~0S%Hz
PreparedStatement ps = cn.preparedStatement(sql); Y1H8+a5@
{ 5l2Ph4(
ps.setXXX(1,xxx); D.j'n-yw
... - P1OD)B
ps.addBatch(); 8Cs)_bj#!
} q0.+ F4
ps.executeBatch(); ^P~%^?(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 z6B/H2
'[~NRKQJ
事务的处理 utQE$0F
1、关闭Connection的自动提交 5 r"`c
cn.setAutoCommit(false); 0MF[e3)a
2、执行一系列sql语句 .Hl]xI$;+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 26yv w
Statement sm ; '73dsOTIT
sm = cn.createStatement(insert into user...); Y;p _ff
sm.executeUpdate(); $s4 rG=q
sm.close(); x<"1T
w5e
sm = cn.createStatement("insert into corp...); syA*!Up
sm.executeUpdate(); CVo@zr$
sm.close(); K\nN2y
3、提交 d47b&.v8e
cn.commit(); 5.]+K<:h"A
4、如果发生异常,那么回滚 vJ7I
[Z
cn.rollback();