java 数据库基本操作 2$fFl,v!z
1、java数据库操作基本流程 T[z}^"
2、几个常用的重要技巧: \h#,qTE
可滚动、更新的记录集 (D?%(f
批量更新 |2YkZ nJn
事务处理 <#[_S$54
CSA.6uIT
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {DI`HB[
1、取得数据库连接 L$Uy
1)用DriverManager取数据库连接 @AvDV$F
例子 w`N|e0G@
String className,url,uid,pwd; D)]U+Qk
className = "oracle.jdbc.driver.OracleDriver"; N`G*
h^YQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; &yQilyU{V
uid = "system"; _D{V(c<WD
pwd = "manager"; R.Plfm06Ue
Class.forName(className); WeqE9@V
Connection cn = DriverManager.getConnection(url,uid,pwd); uA'S8b%C
2)用jndi(java的命名和目录服务)方式
`.Oj^H6
例子 ^tw\F7
String jndi = "jdbc/db"; X
J+y5at
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); a-A>A_.
DataSource ds = (DataSource) ctx.lookup(jndi); p}b:(QN~m
Connection cn = ds.getConnection(); N FVr$?P
多用于jsp中 @y|ZXPC#
2、执行sql语句 z
?3G`
1)用Statement来执行sql语句 2/T4.[`t
String sql; vM.Y/,7S
Statement sm = cn.createStatement(); 8RA]h?$$J
sm.executeQuery(sql); // 执行数据查询语句(select) n]15 ~GO.
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5-=&4R\k
2)用PreparedStatement来执行sql语句 1\[En/6
String sql; +b9gP\Hke
sql = "insert into user (id,name) values (?,?)"; 5i<E AKL
PreparedStatement ps = cn.prepareStatement(sql); )\k({S
ps.setInt(1,xxx); ~36)3W[4
ps.setString(2,xxx); EJ%Kr$51K
... cl`!A2F1G#
ResultSet rs = ps.executeQuery(); // 查询 $X>$)U'p&-
int c = ps.executeUpdate(); // 更新 o'Uaz*-po
$jc&Tk#
3、处理执行结果 +1te 8P*
查询语句,返回记录集ResultSet aJ4y%Gy?
更新语句,返回数字,表示该更新影响的记录数 !xIK<H{*
ResultSet的方法 \8KAK3i'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false VssD
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6*{sZMG
z-J?x-<
4、释放连接 }.L\O]~{
cn.close(); 4YT d
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Y]9AC
6]Vf`i
可滚动、更新的记录集 8iB}gHe9
1、创建可滚动、更新的Statement ]"*sp
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); bg =<) s
该Statement取得的ResultSet就是可滚动的 [?=Vqd
2、创建PreparedStatement时指定参数 )zKZ<;#y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <%SG
<|t
ResultSet.absolute(9000); u>K(m))5W3
批量更新 vg.K-"yQW
1、Statement R)>F*GsR
Statement sm = cn.createStatement(); :/.SrkN(A7
sm.addBatch(sql1); zFFip/z\
sm.addBatch(sql2); q[wVC
h
... >U.f`24
sm.executeBatch() cD6T4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 5, j&-{0W
2、PreparedStatement q_R^Q>ZIe
PreparedStatement ps = cn.preparedStatement(sql);
W`d\A3v
{ IHrG!owf
ps.setXXX(1,xxx); Gy3t
... vhEXtjL
ps.addBatch(); ]9 ArT$
} |E(`9
ps.executeBatch(); :
U Yn
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [%1 87dz:D
hE9UWa.Q>
事务的处理 x,+2k6Wn!
1、关闭Connection的自动提交 `El)uTnuZ[
cn.setAutoCommit(false); pAm
L
2、执行一系列sql语句 T``O!>J
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close G(*7hs
Statement sm ; &3:U&}I
sm = cn.createStatement(insert into user...); Z2t
r?]
sm.executeUpdate(); KJLC2,
sm.close(); k/`WfSM\.
sm = cn.createStatement("insert into corp...); ITmW/Im5
sm.executeUpdate(); h%0FKi^
sm.close(); $Rd]eC
3、提交 Bm\OH#
cn.commit(); 5{.g~3"
4、如果发生异常,那么回滚 FZi'#(y
cn.rollback();