java 数据库基本操作 &Fzb6/
1、java数据库操作基本流程 @fZ,.2ar
2、几个常用的重要技巧: uGf@
可滚动、更新的记录集
nzuX&bSw
批量更新 _"Dv
uR
事务处理 7a=gH2]&
*/)c?)"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 hYT0l$Ng
1、取得数据库连接 * J7DY f
1)用DriverManager取数据库连接 L
O_k@3
例子 SO|NaqWa
String className,url,uid,pwd; [fya)}
className = "oracle.jdbc.driver.OracleDriver"; @Q
]=\N:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7 S#J>*
uid = "system"; L3u&/Tn2
pwd = "manager"; LEbB(x;@
Class.forName(className); BOb">6C
Connection cn = DriverManager.getConnection(url,uid,pwd); JgKO|VO
2)用jndi(java的命名和目录服务)方式 xjuN-
例子 ?*G|XnM&
String jndi = "jdbc/db"; c?f4Q,%|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); f}#~-.NGs
DataSource ds = (DataSource) ctx.lookup(jndi); c@!_/0
Connection cn = ds.getConnection(); $Uq|w[LA
多用于jsp中 Zw
26
2、执行sql语句 k2omJ$?v
1)用Statement来执行sql语句 ITE{@1
String sql; Xk~D$~4<
Statement sm = cn.createStatement(); Gv!2f
sm.executeQuery(sql); // 执行数据查询语句(select) ~NrG`
D}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); U2tV4_ e
2)用PreparedStatement来执行sql语句 &Cq`Y !y
String sql; 75cW_t,g
sql = "insert into user (id,name) values (?,?)"; {NmWQyEv
PreparedStatement ps = cn.prepareStatement(sql); T6y\|
ps.setInt(1,xxx); 'Vzp2
ps.setString(2,xxx);
acajHs
... i^X]j
ResultSet rs = ps.executeQuery(); // 查询 xBThq?N?
int c = ps.executeUpdate(); // 更新 zsEc(
9|^2",V
3、处理执行结果 >a!/QMh
查询语句,返回记录集ResultSet I*:%ni2
更新语句,返回数字,表示该更新影响的记录数 aD<A.Lhy
ResultSet的方法 v+W&9>
1、next(),将游标往后移动一行,如果成功返回true;否则返回false )al]*[lY
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 -]N
x,{
9tU]`f
4、释放连接 ''A_[J `>
cn.close(); 2@n{yYwy
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [`#CXq'
@wGPqg
可滚动、更新的记录集 SB;&GHq"n
1、创建可滚动、更新的Statement G, }Yl
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }/0X'o
该Statement取得的ResultSet就是可滚动的 \#2Z)Kz
2、创建PreparedStatement时指定参数 j"t(0m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); WrnrFz
ResultSet.absolute(9000); ^H p; .f.
批量更新 @N>\|!1CC
1、Statement 4qb/daE:Z
Statement sm = cn.createStatement(); SXSgld2uS
sm.addBatch(sql1); I13y6= d
sm.addBatch(sql2); bQzZy5,
... xeg/A}yE
sm.executeBatch() )nC]5MXU
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 lZd(emH@
2、PreparedStatement 7cuE7"
PreparedStatement ps = cn.preparedStatement(sql); WA<v9#m
{ 5N#aXG^9
ps.setXXX(1,xxx); A]_7}<<N
... NlA,'`,
ps.addBatch(); oM
X
} lF<]8m%F
ps.executeBatch(); N~nziY*C,*
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ^rB8? kt
k%]3vRo<
事务的处理 =Pyj%4Rs
1、关闭Connection的自动提交 $f$SNx)),
cn.setAutoCommit(false); f%A;`4`q
2、执行一系列sql语句 #>a\>iKQ2q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close S^JbyD_yoh
Statement sm ; 6gU96Z
sm = cn.createStatement(insert into user...); <.%4 !
}f8
sm.executeUpdate(); Ij7p'a
sm.close(); rP'me2
B
sm = cn.createStatement("insert into corp...); 0.Q
Ujw
sm.executeUpdate(); %HhBt5w
sm.close(); pN,u`[
3、提交 +N]J5Ve-`t
cn.commit(); +WZX.D
4、如果发生异常,那么回滚 k`cfG\;r
cn.rollback();