java 数据库基本操作 Y!aLf[x]
1、java数据库操作基本流程 =nw0# '
2、几个常用的重要技巧: Bqp&2zg)@
可滚动、更新的记录集 w0X$rl1
批量更新 >R#9\/s
事务处理
C6CGj8G
w~n kNqm
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 BPqwDjW
1、取得数据库连接 {RH*8?7
1)用DriverManager取数据库连接 ' Nw6.5
例子 |w4(rs-
String className,url,uid,pwd; ,;c{9H
className = "oracle.jdbc.driver.OracleDriver"; 5/k)\`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; E::<;9
uid = "system"; 4V1|jy3
pwd = "manager"; &62`Wr 0C
Class.forName(className); p#z;cjfSt
Connection cn = DriverManager.getConnection(url,uid,pwd); dhs#D:/{9
2)用jndi(java的命名和目录服务)方式 K# /Ch5?
例子 dw3'T4TC?
String jndi = "jdbc/db"; \3M1.Q4$Gr
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); D?%e"*>
DataSource ds = (DataSource) ctx.lookup(jndi); ~%/'0}F
Connection cn = ds.getConnection(); V.U|OQouT
多用于jsp中 5"[yFmP*
2、执行sql语句 VSx%8IM+X
1)用Statement来执行sql语句 FGDw;lEa9[
String sql; BJ"Ay@D*
Statement sm = cn.createStatement(); Na-q%ru
sm.executeQuery(sql); // 执行数据查询语句(select) Up'."w_zE
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); XQ4dohGCP
2)用PreparedStatement来执行sql语句 c_t7RWV}
String sql; Y5Ft96o))x
sql = "insert into user (id,name) values (?,?)"; roL}lM$
PreparedStatement ps = cn.prepareStatement(sql); I51M}b,[d
ps.setInt(1,xxx); FU'^n6[<B
ps.setString(2,xxx); q;KshpfRMD
... ^fG`DjA)
ResultSet rs = ps.executeQuery(); // 查询 vrQFx~ZztH
int c = ps.executeUpdate(); // 更新 [l`^fnKt
3b,=
3、处理执行结果 1 iquHn
查询语句,返回记录集ResultSet `I@)<d
更新语句,返回数字,表示该更新影响的记录数 {rs6"X^
ResultSet的方法 JE/l#Q!
1、next(),将游标往后移动一行,如果成功返回true;否则返回false O3!Ouh&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zo/0b/lQ
ocq2
4、释放连接 p?_'|#tz
cn.close(); Y7*'QKz2
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9&&kgKKGQ
>c&4_?d&,A
可滚动、更新的记录集 %+D-y+hn
1、创建可滚动、更新的Statement IruyE(;HS
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); G3oxa/mO
该Statement取得的ResultSet就是可滚动的 :~-)Sm+^
2、创建PreparedStatement时指定参数 VyRW '
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); dE+CIjW5
ResultSet.absolute(9000); )`e^F9L
批量更新 -,[~~
1、Statement 3zk:59
Statement sm = cn.createStatement(); ?&{S~[;l
sm.addBatch(sql1); u!m,ilAnd
sm.addBatch(sql2); PXOq#
... dCW0^k
sm.executeBatch() {K< ~
vj;
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Hf!9`R[
2、PreparedStatement \,$r,6-g
PreparedStatement ps = cn.preparedStatement(sql); ;jp6 }zfI
{ InAU\! ew
ps.setXXX(1,xxx); yp( ?1
... b/T20F{W\o
ps.addBatch(); XCKY
xv&
} cw*(L5bu
ps.executeBatch(); V<
2IIH5^
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Vi Cg|1c
-lnTYxo+]^
事务的处理 /e;e\k_}'
1、关闭Connection的自动提交 BDarJY
cn.setAutoCommit(false); Q>cL?ie
2、执行一系列sql语句 Xi 1q]ps
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 50}.Xm@,BO
Statement sm ; /h{go]&Nb
sm = cn.createStatement(insert into user...); ;LwFbkOuU
sm.executeUpdate(); Vp5V
m
sm.close(); ;9 =}_h)]
sm = cn.createStatement("insert into corp...); olUqBQ&ol
sm.executeUpdate(); %4QoF
sm.close(); CpBQ>!CW
3、提交 ~}hba3&b;#
cn.commit(); d=Rk\F'^J
4、如果发生异常,那么回滚 vE^h}~5U
cn.rollback();