java 数据库基本操作 $@s&qi_&R
1、java数据库操作基本流程 Ho2#'lSKM
2、几个常用的重要技巧: FxW~Co
可滚动、更新的记录集 ~ep-XO
批量更新 uD}Q}]Z
事务处理 !g'kWE[
a~>+I~^K5q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9'Le}`Gf
1、取得数据库连接 N8#wQ*MM>
1)用DriverManager取数据库连接 -c{O!z6sX
例子 'S;INs2|->
String className,url,uid,pwd;
&gR)Y3
className = "oracle.jdbc.driver.OracleDriver"; eVGO6 2|!
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; jb|al[p\
uid = "system"; EyO=M~nsS
pwd = "manager"; UP' ~D]J
Class.forName(className); .nl!KzO6g
Connection cn = DriverManager.getConnection(url,uid,pwd); V:s$V.{!
2)用jndi(java的命名和目录服务)方式
ltK\)L
例子 >k }ea5+
String jndi = "jdbc/db"; rO[ cm}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); >g+yw1nC
DataSource ds = (DataSource) ctx.lookup(jndi); ~4fUaMT
Connection cn = ds.getConnection(); ]?rVram;z
多用于jsp中 `tw[{Wb
2、执行sql语句 i&= I5$
1)用Statement来执行sql语句 <Nwqt[.
String sql; JFewOt3
Statement sm = cn.createStatement(); I&vD >a5#
sm.executeQuery(sql); // 执行数据查询语句(select) ]Dec/Nnj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); y(^t &tgjS
2)用PreparedStatement来执行sql语句 :7>oFz
String sql; '{*{
sql = "insert into user (id,name) values (?,?)"; _UI*W&*
PreparedStatement ps = cn.prepareStatement(sql); xq$(=WPI
ps.setInt(1,xxx); 69N/_V
ps.setString(2,xxx); >xsbXQ>.
... h}0}g]IUx
ResultSet rs = ps.executeQuery(); // 查询 o^+2%S`]
int c = ps.executeUpdate(); // 更新 2@~.FBby7@
+Np[m$Z*
3、处理执行结果 MkLXMwuQ&
查询语句,返回记录集ResultSet kD;1+lNz
更新语句,返回数字,表示该更新影响的记录数 P|j|0o,8p
ResultSet的方法 Cw$0XyO
1、next(),将游标往后移动一行,如果成功返回true;否则返回false vxE#6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `xv2,Z9<
UI2TW)^2
4、释放连接 08czP-)OZ
cn.close(); MD|T4PPz,}
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection GBeWF-`B
*uW l 804
可滚动、更新的记录集 C-)mP- |8
1、创建可滚动、更新的Statement 2~`vV'K
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w.X MyHj
该Statement取得的ResultSet就是可滚动的 1V
,Mk#_
2、创建PreparedStatement时指定参数 7M8oI.?C|
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /|s~X@%K
ResultSet.absolute(9000); 27J!oin$
批量更新 ;z2\ Q$
1、Statement ?qC6p|H
Statement sm = cn.createStatement(); W>#[a %R
sm.addBatch(sql1); #
RoJD:9
sm.addBatch(sql2); m#K)%0
... }Wlm#t
sm.executeBatch() Lh@0|k
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 c~``)N
2、PreparedStatement qTZ\;[CrP"
PreparedStatement ps = cn.preparedStatement(sql); amTeTo]Tg
{ A4uKE"WE
ps.setXXX(1,xxx); u}r> ?/V!
... @6lw_E_5
ps.addBatch(); epN!+(v
} JkShtLEr
ps.executeBatch(); \<ko)I#%
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 p~'iK4[&6
>V%lA3
事务的处理 ~ECIL7,
1、关闭Connection的自动提交 =e)t,YVm
cn.setAutoCommit(false); pq"Z,9,F%
2、执行一系列sql语句 *c<6 Er>s
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close OI^??joQ
Statement sm ; o%yfR.M6$
sm = cn.createStatement(insert into user...); PfR|\{(
sm.executeUpdate(); v*";A
sm.close(); ;NMv>1fI
sm = cn.createStatement("insert into corp...); y`,;m#frT
sm.executeUpdate(); jFDVd;#CS
sm.close(); 9| g]M:{
3、提交 O*7vmPy
cn.commit(); %g_)_ ~
4、如果发生异常,那么回滚 -=cxUDB
cn.rollback();