java 数据库基本操作 3:">]LMi
1、java数据库操作基本流程 [0_JS 2KE
2、几个常用的重要技巧: `EV"
/&`
可滚动、更新的记录集 a@|/D\C
批量更新 R^}}-Dvr
事务处理 G}o?lo\#h
L<kIzB !
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 e&Z\hZBb
1、取得数据库连接 T;cyU9
1)用DriverManager取数据库连接 Wq bfZx
例子 g/)$-Z)Nu
String className,url,uid,pwd; }PZz(Ms
className = "oracle.jdbc.driver.OracleDriver"; ;j#$d@VG"
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; f8ap+][
uid = "system"; 2?",2x09
pwd = "manager"; oYYns%r}{
Class.forName(className); _xg4;W6M=
Connection cn = DriverManager.getConnection(url,uid,pwd); }pE8G#O&
2)用jndi(java的命名和目录服务)方式 @S/PB[%S
例子 q|E0Y
String jndi = "jdbc/db"; R^%uEP
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); u/Os
DataSource ds = (DataSource) ctx.lookup(jndi); Xx;RH9YYz
Connection cn = ds.getConnection(); '%W'HqVcG1
多用于jsp中 Cd4a7<-
2、执行sql语句 4Xna}7
1)用Statement来执行sql语句 <OKzb3e
String sql; u9WQ0.
Statement sm = cn.createStatement(); pNOVyyo>BW
sm.executeQuery(sql); // 执行数据查询语句(select) 2<dl23
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); h[5<S&
2)用PreparedStatement来执行sql语句 KY)rkfo B
String sql; "3!!G=s P
sql = "insert into user (id,name) values (?,?)"; T5mdC
PreparedStatement ps = cn.prepareStatement(sql); .YvE
ps.setInt(1,xxx); -qki^!Y?
ps.setString(2,xxx); |E\0Rv{H3
... }3t bqFiH
ResultSet rs = ps.executeQuery(); // 查询 CgLS2
int c = ps.executeUpdate(); // 更新 N=qe*Rlf
vYh_<Rp5
3、处理执行结果 O"otzla
查询语句,返回记录集ResultSet 5z ebH
更新语句,返回数字,表示该更新影响的记录数 /Q7cQ2[EU
ResultSet的方法 rm7$i9DH2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,/.U'{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 jTNfGu0x
F&{RP>
4、释放连接 o<`)cb }
cn.close(); Sz\"*W;>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ^wL
n
| v?
pS
可滚动、更新的记录集 DRldRm/
1、创建可滚动、更新的Statement QjW7XVxB#N
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); RU>Hr5ebo
该Statement取得的ResultSet就是可滚动的 G)(\!0pNZ
2、创建PreparedStatement时指定参数 4<S*g u*W
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #A8d@]Ps
ResultSet.absolute(9000); 5XO eYO{
批量更新 fvajNP
1、Statement V?g@pnN"
Statement sm = cn.createStatement(); >Z#=<
sm.addBatch(sql1); Wsn}Y-x
sm.addBatch(sql2); RP]hW{:U
... 1vcI`8%S+u
sm.executeBatch() 4X2XSK4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |aiP7C
2、PreparedStatement dzYB0vut@
PreparedStatement ps = cn.preparedStatement(sql); O*3x'I*a
{ yVThbL_YJ
ps.setXXX(1,xxx); lVywc:X
... 4\HB rd#P
ps.addBatch(); h&7]Bp
} =<-tD<
ps.executeBatch(); 55vpnRM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 '1)BZ!
aqvt$u8
事务的处理 >3H/~ Y
1、关闭Connection的自动提交 tuA,t
cn.setAutoCommit(false); *_<P%J
2、执行一系列sql语句 1sFTXl
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close WA-`
*m$v
Statement sm ; m`<Mzk.u<
sm = cn.createStatement(insert into user...); RUTlwTdv
sm.executeUpdate(); T^-fn
sm.close(); t#+X*'/
sm = cn.createStatement("insert into corp...); R5LzqT,/N:
sm.executeUpdate(); 15Vb`Vf`N
sm.close(); #C?T
3、提交 ^7`"wj14
cn.commit(); 0_HdjK
4、如果发生异常,那么回滚 \Nc/W!r*9
cn.rollback();