java 数据库基本操作 \-c70v63X
1、java数据库操作基本流程 6 Rg{^E Rf
2、几个常用的重要技巧: qd(`~a
可滚动、更新的记录集 <r_ldkZ
批量更新 ,US]
事务处理 0f1*#8-6
XlR.Y~
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 BQ &|=a6
1、取得数据库连接 ;}1*M !
1)用DriverManager取数据库连接 #
bP1rQ0
例子 mpN|U(n
String className,url,uid,pwd; ;CFI*Wfp
className = "oracle.jdbc.driver.OracleDriver"; >P/.X^G0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; O?rVa:\
uid = "system"; P!1y@R>Ln
pwd = "manager";
jsH7EhF{'
Class.forName(className); W}XDzR'<
Connection cn = DriverManager.getConnection(url,uid,pwd); 7H9&\ur9+
2)用jndi(java的命名和目录服务)方式 "1WwSh}Z
例子 S9U`-\L0
String jndi = "jdbc/db";
_6xC4@~h*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -NHc~=m
DataSource ds = (DataSource) ctx.lookup(jndi); [gx6e 44
Connection cn = ds.getConnection(); wxN'Lv=R
多用于jsp中 t4~Bn<=
2、执行sql语句 m.Yj{u8zX
1)用Statement来执行sql语句 &n91f
String sql; c|IH|y
Statement sm = cn.createStatement(); &Z#g/Hc
sm.executeQuery(sql); // 执行数据查询语句(select) NRgNh5/
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Xw_AZ-|1D
2)用PreparedStatement来执行sql语句 k0Rd:DxO
String sql; R~PD[.\u
sql = "insert into user (id,name) values (?,?)"; yC(xi"!
PreparedStatement ps = cn.prepareStatement(sql); Y{6y.F*Q#
ps.setInt(1,xxx); M9M~[[
ps.setString(2,xxx); R:fERj<s
... MB%yC]w8
ResultSet rs = ps.executeQuery(); // 查询 {p=`"H>
int c = ps.executeUpdate(); // 更新 'M VE5
qwoF4_VN
3、处理执行结果 (V!:6
查询语句,返回记录集ResultSet 2mRm.e9?
更新语句,返回数字,表示该更新影响的记录数 ]>B>.s
ResultSet的方法 <My4 )3
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 1-.6psE
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 D!^&*Ia?2
:Z3Tyj}4
4、释放连接 L9W'TvTwo
cn.close(); lpvZ[^G
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection o]u,<bM$
tHgu#k0
可滚动、更新的记录集 *S%~0=
1、创建可滚动、更新的Statement WzDL(~m+Z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); =c8xg/
该Statement取得的ResultSet就是可滚动的 }(FF^Mh
2、创建PreparedStatement时指定参数 @FO=0_;y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); )O;6S$z9Y
ResultSet.absolute(9000); vtk0 j
批量更新 .hPk}B/KV
1、Statement
= ss(~[
Statement sm = cn.createStatement(); 8eGq.+5G
sm.addBatch(sql1); 62)Qr
sm.addBatch(sql2); J2W#vFe\
... Z8IY!d
sm.executeBatch() waT'|9{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 THEpW{.E
2、PreparedStatement ' d' Dlg
PreparedStatement ps = cn.preparedStatement(sql); KW`^uoY$
{ o"wvP~H
ps.setXXX(1,xxx); "tdF#>x
... zZR_&z<
ps.addBatch(); pL2P
.
} @
LPs.e
ps.executeBatch(); R2,Z`I
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 y=.`:EB9b
ktF\f[
事务的处理 a=@]Ov/
1、关闭Connection的自动提交 C%&A9(jG
cn.setAutoCommit(false); PuO5@SP~
2、执行一系列sql语句 w5Lev}Rb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close uW;[FTcqy$
Statement sm ; OYW:I1K<5
sm = cn.createStatement(insert into user...); f"9aL= 3
sm.executeUpdate(); \Hb"bv
sm.close(); S*PcK>
sm = cn.createStatement("insert into corp...); bAOL<0RS9`
sm.executeUpdate(); 5NGQWg
sm.close(); X/Sp!W-H
3、提交 [L(qrAQ2|z
cn.commit(); ^`iqa-1
4、如果发生异常,那么回滚 ^jhc(ZW"
cn.rollback();