java 数据库基本操作 r+lY9l
1、java数据库操作基本流程 V) a6H^l
2、几个常用的重要技巧: 7=<PVJ*/
可滚动、更新的记录集 D8dTw {C
批量更新 C#r`oZS1
事务处理 {UUVN/$
C/cGr)|8%
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Hou{tUm{xC
1、取得数据库连接 qq?>ulu*W
1)用DriverManager取数据库连接 }40/GWp<f
例子 _c(=>
String className,url,uid,pwd; A>4k4*aFm#
className = "oracle.jdbc.driver.OracleDriver"; l y%**iN
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +f7?L]wzic
uid = "system"; ivagS\Q
pwd = "manager"; %(kq Hxc
Class.forName(className); .i. |wY
Connection cn = DriverManager.getConnection(url,uid,pwd); J}YI-t
2)用jndi(java的命名和目录服务)方式 E""/dC:B
例子 e6_.ID'3
String jndi = "jdbc/db"; pGcc6q1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); {jc~s~<#
DataSource ds = (DataSource) ctx.lookup(jndi); We4 FR4`
Connection cn = ds.getConnection(); |Ji?p>\~
多用于jsp中 YT3QwN9
2、执行sql语句 .(hb8 rCM
1)用Statement来执行sql语句 &x3"Rq_
String sql; nRo`O
Statement sm = cn.createStatement(); e;pNB
sm.executeQuery(sql); // 执行数据查询语句(select) txgGL'
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); DRzpV6s
2)用PreparedStatement来执行sql语句 JA)gM
String sql; [n}c}%
sql = "insert into user (id,name) values (?,?)"; i;tA<-$-
PreparedStatement ps = cn.prepareStatement(sql); 3jn@ [ m
ps.setInt(1,xxx); %-*vlNC )
ps.setString(2,xxx); P! 3$RO
... 5m bs0GL
ResultSet rs = ps.executeQuery(); // 查询 JZv]tJWq
int c = ps.executeUpdate(); // 更新 QO?ha'Sl
+
zrwz\
3、处理执行结果 $yc,D=*Isi
查询语句,返回记录集ResultSet 2+P3Sii
更新语句,返回数字,表示该更新影响的记录数 Mb9q<4
ResultSet的方法 '^J/aV
1、next(),将游标往后移动一行,如果成功返回true;否则返回false o|}%pc3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2$Ji4`p}S
,yqzk.
4、释放连接 njX:[_&
cn.close(); g SwG=e\
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection E:o:)h?$
PRLV1o1#
可滚动、更新的记录集 !'gz&3B~h
1、创建可滚动、更新的Statement "''<:K|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); m0*
B[
该Statement取得的ResultSet就是可滚动的 eHJ7L8#
2、创建PreparedStatement时指定参数 q%'ovX(dm
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); YH[_0!JY^
ResultSet.absolute(9000); EGDE4n5>I
批量更新 5]Ra?rF
1、Statement `MwQ6%lf
Statement sm = cn.createStatement(); $oQsh|sTI
sm.addBatch(sql1); R] [M_ r
sm.addBatch(sql2); hHg
gH4T
... Gu}x+hG
sm.executeBatch() 5HIpoj;\(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6nfkZvn
2、PreparedStatement '?>eW2d
PreparedStatement ps = cn.preparedStatement(sql); Q)@1:(V/
{ O1ha'@qID
ps.setXXX(1,xxx); ^hHeH:@
... {UmCn>c
ps.addBatch(); (p?3#|^
} z\h+6FCD
ps.executeBatch(); oto od
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7
b.-&,
?xo,)``
事务的处理 i]-gO
1、关闭Connection的自动提交 _]S6>
cn.setAutoCommit(false); +{%4&T<nHw
2、执行一系列sql语句 5muW*7
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Gh|!FRK[$
Statement sm ; =zjUd 5
sm = cn.createStatement(insert into user...);
ke#;1
sm.executeUpdate(); #rpqt{ml
sm.close(); eq+o_R}CS
sm = cn.createStatement("insert into corp...); }J?fJ(
sm.executeUpdate(); I:_*8el&d
sm.close(); {^kG<v.vV
3、提交 QO7:iSZJ
cn.commit(); |Hm'.-
4、如果发生异常,那么回滚 ?iLd5 Z
cn.rollback();