java 数据库基本操作 Ac`;st%l.
1、java数据库操作基本流程 u okc:D
2、几个常用的重要技巧: 2khh4?|\
可滚动、更新的记录集 e;h,V(
批量更新 RV;!05^<
事务处理 :$%>4+l
Qnt5HSSt
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `*_CElpP"
1、取得数据库连接 pRrHuLj^
1)用DriverManager取数据库连接 Z9[+'ZWt
例子 ||Y<f *
String className,url,uid,pwd; ~=cmM
className = "oracle.jdbc.driver.OracleDriver"; S&wzB)#'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; u-:Ic.ZV
uid = "system"; }`_(<H
pwd = "manager"; "r$/
Class.forName(className); )];aI A$
Connection cn = DriverManager.getConnection(url,uid,pwd); tJ'iX>9I
2)用jndi(java的命名和目录服务)方式 e.8$ga{
例子 7u|B ](FS
String jndi = "jdbc/db"; wk @,wOt
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [_.n$p-
DataSource ds = (DataSource) ctx.lookup(jndi); 24B<[lSK
Connection cn = ds.getConnection(); iKAusWj
多用于jsp中 3i=Iu0
2、执行sql语句 |8U;m:AS
1)用Statement来执行sql语句 B<,YPS8w
String sql; qINTCm j
Statement sm = cn.createStatement(); ,b|-rU\
sm.executeQuery(sql); // 执行数据查询语句(select) T1bd:mC}n
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); kO_5|6
2)用PreparedStatement来执行sql语句 #{PmNx%M
String sql; ppN} k)m
sql = "insert into user (id,name) values (?,?)"; KY.ZT2k
PreparedStatement ps = cn.prepareStatement(sql); 76@qHTh}
ps.setInt(1,xxx); H=~9CJ+tc
ps.setString(2,xxx); (MLhaux-
... +@:L|uFU
ResultSet rs = ps.executeQuery(); // 查询 OfZN|S+~W
int c = ps.executeUpdate(); // 更新 m3 -9b"
*9D!A
3、处理执行结果 N`$!p9r
查询语句,返回记录集ResultSet 3WUH~l{UJ
更新语句,返回数字,表示该更新影响的记录数 27#5y_
`
ResultSet的方法 *y]+dK&-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false K{=PQ XSU
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :L:&t,X
fY W|p<Q0
4、释放连接 4XJiIa?
cn.close(); Gquuy7[&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $NG++N
Mvcfk$pA
可滚动、更新的记录集 ar^i|`D
1、创建可滚动、更新的Statement $k%Z$NSN=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); :YO@_
该Statement取得的ResultSet就是可滚动的 sWqM?2g
2、创建PreparedStatement时指定参数 cUk*C
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); \?lz&<
ResultSet.absolute(9000); 5v
_P
Oq
批量更新 fZ{[]dn[
1、Statement |FNCXlgZ
Statement sm = cn.createStatement(); `JURQ:l)3^
sm.addBatch(sql1); N#k61x
sm.addBatch(sql2); r{K;|'d%h
... (f#b7O-Wn
sm.executeBatch() =RsXI&&vh
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g0R[xOS|
2、PreparedStatement `u_Qa
PreparedStatement ps = cn.preparedStatement(sql); [hh/1[
{ /aqEJGG>
ps.setXXX(1,xxx); +%0z`E\?M#
... `I;F$ `\
ps.addBatch(); K5 KyG
} ,6"l (]0
ps.executeBatch(); 8e2?tmWM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 *hY2.t; X
L%\b' fs
事务的处理 2A:,;~UH
1、关闭Connection的自动提交 wCKj7y[
cn.setAutoCommit(false); {/8Q)2*>0
2、执行一系列sql语句 Da1aI]{I
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close I'!/[\_
Statement sm ; MaY682}|y
sm = cn.createStatement(insert into user...); .~D>5 JnEk
sm.executeUpdate(); !8Rw O%c(
sm.close(); tWPO]3hW
sm = cn.createStatement("insert into corp...); <L0#O(L
sm.executeUpdate(); r4XH =
sm.close(); G|
m4m.
3、提交 H9 tXSh
cn.commit(); A\sI<WrH
4、如果发生异常,那么回滚 7hw .B'7
cn.rollback();