java 数据库基本操作 Yj/nzTVJ[
1、java数据库操作基本流程 B^~Bv!tHWr
2、几个常用的重要技巧: Ytwv=;h-
可滚动、更新的记录集 fZ:rz;tM
批量更新 p!QneeA`&X
事务处理 QfWu~[
GSnHxs)
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 v^_]W3K
1、取得数据库连接 PVc|y.
1)用DriverManager取数据库连接 YPDsE&,J)
例子 7d8qs%nA
String className,url,uid,pwd; S{7ik,Gdg
className = "oracle.jdbc.driver.OracleDriver"; 6x,=SW@4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (G%gVk]
uid = "system"; [Ms{J!^q
pwd = "manager"; WTv\HI2X
!
Class.forName(className); I jztj
Connection cn = DriverManager.getConnection(url,uid,pwd); i=H>D
2)用jndi(java的命名和目录服务)方式 H6S vU
例子 9Sl|l.;!
String jndi = "jdbc/db"; O[p^lr(B7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); UA4d|^ev
DataSource ds = (DataSource) ctx.lookup(jndi); 4?M3#],'h
Connection cn = ds.getConnection(); Xb:BIp!e
多用于jsp中 fA0=Y,pzv
2、执行sql语句 JgKZ;GM:W
1)用Statement来执行sql语句 L{%a4Ip
String sql; maEpT43f
Statement sm = cn.createStatement(); FDs^S)B
sm.executeQuery(sql); // 执行数据查询语句(select) jTUf4&b-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $RNUr
\9A
2)用PreparedStatement来执行sql语句 4yZ+,hqJ<9
String sql; l%U_iqL&
sql = "insert into user (id,name) values (?,?)"; %R*vSRG/U
PreparedStatement ps = cn.prepareStatement(sql); jy@i(@Z
ps.setInt(1,xxx); G$|;~'E
ps.setString(2,xxx); UQ?OD~7
... [67E5rk-
ResultSet rs = ps.executeQuery(); // 查询 , !%R5*?=D
int c = ps.executeUpdate(); // 更新 SLjf<.S
F@'rP++4
3、处理执行结果
{%~4RZA
查询语句,返回记录集ResultSet C
3XZD4.2
更新语句,返回数字,表示该更新影响的记录数 [x p,&
ResultSet的方法 !5SQN5K
1、next(),将游标往后移动一行,如果成功返回true;否则返回false mS~ ]I$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 UK_aqB
DcR}pQ(e
4、释放连接 D62
NU
cn.close(); <6O_t,K]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >aC\_Mc
ZWhmO=b!
可滚动、更新的记录集 tvH\iS #V
1、创建可滚动、更新的Statement qM!f
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); xm,`4WdG
该Statement取得的ResultSet就是可滚动的 V;hwAQbF
2、创建PreparedStatement时指定参数 eGSp(o5 6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Z*9]:dG:!
ResultSet.absolute(9000); :Ip:sRz
批量更新 jM1%6
1、Statement 69j~?w)^
Statement sm = cn.createStatement(); &<|-> *v
sm.addBatch(sql1); FJ(B]n[>
sm.addBatch(sql2); u6Qf*_- K
... i$^B-
sm.executeBatch() Q$h:[_v
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "3i80R\w`F
2、PreparedStatement _X2EBpZp
PreparedStatement ps = cn.preparedStatement(sql); -llx:
{ Ag4Ga?&8ec
ps.setXXX(1,xxx); -6~y$c&c
... Z'*Z@u3
ps.addBatch(); 7kX$wQZ_
} !MJe+.
ps.executeBatch(); ,Lun-aMd
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;y~{+{{Ow
"`i:)E t
事务的处理 D@\;@(
|
1、关闭Connection的自动提交 H9san5{
cn.setAutoCommit(false); c6Aut`dK
2、执行一系列sql语句 ?X#/1X%u:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @6
;oN
Statement sm ; bA<AG*
sm = cn.createStatement(insert into user...); r -q3+c^+
sm.executeUpdate(); z'oiyXEE3
sm.close(); ){
sm = cn.createStatement("insert into corp...); W\qLZuQ
sm.executeUpdate(); G]mWaA
sm.close(); >'}=.3\
3、提交 h#m:Y~GoF
cn.commit(); $#!UGY
4、如果发生异常,那么回滚 pgd8`$(Q
cn.rollback();