java 数据库基本操作 /Z,hQ>/
1、java数据库操作基本流程 6As%<g=
2、几个常用的重要技巧: pM}~/
可滚动、更新的记录集 7B\Q5fLQ
批量更新 $15H_X*!
事务处理 "_&c[VptWi
xGOVMo
+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 L./c#b!{
1、取得数据库连接 .!Kqcz% A
1)用DriverManager取数据库连接 \CVHtV
例子 Xo&\~b#-
String className,url,uid,pwd; cbs ;
className = "oracle.jdbc.driver.OracleDriver"; H8=:LF
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !l Egta[Ql
uid = "system"; F^aD#
pwd = "manager"; WtaOf_
Class.forName(className); `j!_tE`
Connection cn = DriverManager.getConnection(url,uid,pwd); u[oV
Jvc
2)用jndi(java的命名和目录服务)方式 T7Y}v,+-
例子 ~*9Ue@
String jndi = "jdbc/db"; hJD3G
|E
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); o)]O
DataSource ds = (DataSource) ctx.lookup(jndi); _:WNk(
Connection cn = ds.getConnection(); x+;y0`oL
多用于jsp中 =N8_S$nx(
2、执行sql语句 6:6A"A
1)用Statement来执行sql语句 YDj5+'y
String sql; Jb^{o+s53
Statement sm = cn.createStatement(); FSAX,Y
sm.executeQuery(sql); // 执行数据查询语句(select) C"%B>e
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); (|rf>=B+H
2)用PreparedStatement来执行sql语句 vxLr034
String sql; [HUK
9hG
sql = "insert into user (id,name) values (?,?)"; %u_dxpx
PreparedStatement ps = cn.prepareStatement(sql); .N@+Ms3
ps.setInt(1,xxx); /y6f~F
ps.setString(2,xxx); cza_LO(
... CC;^J-h/
ResultSet rs = ps.executeQuery(); // 查询 bN03}&I
int c = ps.executeUpdate(); // 更新 D.|r
[c
!pkIaCxs
3、处理执行结果 S^|U"
查询语句,返回记录集ResultSet z
Tz_"NI
更新语句,返回数字,表示该更新影响的记录数 }/,Rp/+7]
ResultSet的方法 ~P"Agpx3u
1、next(),将游标往后移动一行,如果成功返回true;否则返回false RA;/ ?l
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 -sZb+2tDa
Li"+`
4、释放连接 EWgJ"WTF
cn.close(); A~lc`m-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &43c/TSb
c))?9H
,e)
可滚动、更新的记录集 \nPf\6;M
1、创建可滚动、更新的Statement 0fn*;f8{XJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); MGxkqy?
该Statement取得的ResultSet就是可滚动的 OP" _I!t
2、创建PreparedStatement时指定参数 2|d^#8)ZC
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F&m9G >r
ResultSet.absolute(9000); WSN^iDS
批量更新 ?6hd(^
1、Statement q\|RI;W
Statement sm = cn.createStatement(); DV[FZ
sm.addBatch(sql1); -mn/Yv
sm.addBatch(sql2); vy{k"W&S
... G%;>_E
sm.executeBatch() '3Q~y"C+4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 D~U RY_[A
2、PreparedStatement w6)Q5H53)
PreparedStatement ps = cn.preparedStatement(sql); f 1+
{ VB#&`]rdo
ps.setXXX(1,xxx); kh:_,g
... Lo#G. s|
ps.addBatch(); c@"FV,L>
} i$Kx@,O8t
ps.executeBatch(); U]_WX(4 @
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "bF52lLu
QKB+mjMH#x
事务的处理 5u;//Cm
1、关闭Connection的自动提交 ,(zV~-:9
cn.setAutoCommit(false); Tsj/alC[
2、执行一系列sql语句 \w>Rmf'|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 1K<}
Statement sm ; wy#>Aq
sm = cn.createStatement(insert into user...); _SOwiz
sm.executeUpdate(); FQ1B%u|
sm.close(); s}OL)rW=}
sm = cn.createStatement("insert into corp...); 9+PAyI#w
sm.executeUpdate(); cs.t#C
sm.close(); xW*Lceb
3、提交 g,!.`[e'ex
cn.commit(); PREGQ0
4、如果发生异常,那么回滚 dE_"|,:
cn.rollback();