java 数据库基本操作 Q3"{v0
1、java数据库操作基本流程 .,h>2;f
2、几个常用的重要技巧: 03pD<
可滚动、更新的记录集 3']a1\sy^
批量更新 <$z6:4uN_
事务处理 W>#[a %R
#
RoJD:9
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 NVnId p
1、取得数据库连接 p>oC.[:4a
1)用DriverManager取数据库连接 A:b(@'h
例子 w :nYsuF
String className,url,uid,pwd; 5}C.^ J`
className = "oracle.jdbc.driver.OracleDriver"; qTZ\;[CrP"
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; amTeTo]Tg
uid = "system"; A4uKE"WE
pwd = "manager"; j)nL!":O
Class.forName(className); 6C'W
Connection cn = DriverManager.getConnection(url,uid,pwd); U_Jchi,!
2)用jndi(java的命名和目录服务)方式 Sy@)Q[A
例子 U1ZKJ<pv
String jndi = "jdbc/db"; IN8G4\r
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); lQl!TW"aO
DataSource ds = (DataSource) ctx.lookup(jndi); )2sE9G,
Connection cn = ds.getConnection(); Yyx sj9
多用于jsp中 Xfc+0$U@
2、执行sql语句 Y-?0!a=e.
1)用Statement来执行sql语句 %8O1sF
String sql; W{RZ@3ZY
Statement sm = cn.createStatement(); HOaNhJ{7D
sm.executeQuery(sql); // 执行数据查询语句(select) g?.y7!m
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]SC|%B_*
2)用PreparedStatement来执行sql语句 R?t_tmKXC!
String sql; /9pN.E
sql = "insert into user (id,name) values (?,?)"; =fRC$
PreparedStatement ps = cn.prepareStatement(sql); ObPXVqG"?
ps.setInt(1,xxx); %g_)_ ~
ps.setString(2,xxx); 8KyRD1 (-R
... _jb'HP
ResultSet rs = ps.executeQuery(); // 查询 {=%,NwPs
int c = ps.executeUpdate(); // 更新 aP$it6Z
TTa$wiW7'
3、处理执行结果 HKL/D
查询语句,返回记录集ResultSet efr 9
更新语句,返回数字,表示该更新影响的记录数 vX@TZet0
ResultSet的方法 /S{U|GBB%r
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6&
(b L<8b
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 dAWB.#
l|81_B C"
4、释放连接 T09 5]*Hm
cn.close(); ^GpLl
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @cr/&
O llS
可滚动、更新的记录集 S,Z~-j
1、创建可滚动、更新的Statement |*/-~5"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ?6Wv["%
该Statement取得的ResultSet就是可滚动的 q4ttmL8
2、创建PreparedStatement时指定参数 R-Ys<;
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); )IVk4|
ResultSet.absolute(9000); %9
3R/bx
批量更新 ^Gi7th,
1、Statement b>-h4{B[
Statement sm = cn.createStatement(); iE EP~
sm.addBatch(sql1); w}]BJ<C
sm.addBatch(sql2); 0QP=$X
... BOOb{kcg
sm.executeBatch() ?edf$-"z/
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 p*j>s\
2、PreparedStatement 0q4PhxR`e
PreparedStatement ps = cn.preparedStatement(sql); [uwn\-
{ ?y-@c]
ps.setXXX(1,xxx); &MZ{B/;;H
... =8vNOvA
ps.addBatch(); KE.O>M,I.
} U!{~L$S
ps.executeBatch(); %iB,hGatE
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 NCdDG
-%Rw2@vU
事务的处理 v#lrF\G5
1、关闭Connection的自动提交 ZZw2m@T>
cn.setAutoCommit(false); fH@cC`
2、执行一系列sql语句 &OlX CxH
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =xQPg0g
Statement sm ; 1N_T/I8_F
sm = cn.createStatement(insert into user...); O>N/6Z
sm.executeUpdate();
7 }I';>QH
sm.close(); 6j8\3H~
sm = cn.createStatement("insert into corp...); e*}*3kw)T
sm.executeUpdate(); GEvx<:
sm.close(); %+nM4)h
3、提交 M]|]b-#
cn.commit(); Y<IuwS
4、如果发生异常,那么回滚 Ee_?aG
e&
cn.rollback();