java 数据库基本操作 IQ3n@
1、java数据库操作基本流程 +D:83h{
2、几个常用的重要技巧: 99^AT*ByY
可滚动、更新的记录集 2)wAFO6u
批量更新 lPY@{1W
事务处理 W|ReLM\
%p0b{P j_p
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 I"ca+4]
1、取得数据库连接 Bk@)b`WR
1)用DriverManager取数据库连接 !|B3i_n
例子 1"}B]5!
String className,url,uid,pwd; br0u@G
className = "oracle.jdbc.driver.OracleDriver"; p?Ed-
S
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; \n#]%X5c
uid = "system"; Hqvc7 -c6
pwd = "manager"; >b>MKm>q
Class.forName(className); pT4qPta,2
Connection cn = DriverManager.getConnection(url,uid,pwd); Ptx,2e&Hq
2)用jndi(java的命名和目录服务)方式 79D=d'eA
例子 E{uf\Fc
String jndi = "jdbc/db"; bH*@,EE
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 42fprt
DataSource ds = (DataSource) ctx.lookup(jndi); Q[M (Wqg
Connection cn = ds.getConnection(); $+Vmwd;
多用于jsp中 '!!e+\h#
2、执行sql语句 R
N@^j
1)用Statement来执行sql语句
bRNK.[|
String sql; @]f3|>I
Statement sm = cn.createStatement(); ~<n(y-P^
sm.executeQuery(sql); // 执行数据查询语句(select) >;)2NrJV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %yp5DD}|
2)用PreparedStatement来执行sql语句 <B!'3C(P
String sql; ##H;Yb
sql = "insert into user (id,name) values (?,?)"; Y}ng_c
PreparedStatement ps = cn.prepareStatement(sql); dFQo
ps.setInt(1,xxx); `gt:gx>a
ps.setString(2,xxx); AHwG<k
... &i5:)d]L
ResultSet rs = ps.executeQuery(); // 查询 Yp*,Jp1
int c = ps.executeUpdate(); // 更新 ~n
WsP}`n
YG4WS |
3、处理执行结果 aqF+zPKs6
查询语句,返回记录集ResultSet 5C/2b.-[
更新语句,返回数字,表示该更新影响的记录数 ;{k=C2
ResultSet的方法 BRb\V42i;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 20aZI2sk`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 S?L#N
Go 1(@
4、释放连接 +'|{1gB
cn.close(); %tV32l=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection SBTPTb
Hle\ON
可滚动、更新的记录集 :r&iMb:Ra
1、创建可滚动、更新的Statement pTWg
m\h
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); , 9mgYp2
该Statement取得的ResultSet就是可滚动的 8lwFAiC8
2、创建PreparedStatement时指定参数 h3kaD
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); CM9 XPr
ResultSet.absolute(9000); #$FrFU;ZR
批量更新 JWWYVl VC
1、Statement 3?2<WEYr
Statement sm = cn.createStatement(); ?q_^Rj$
sm.addBatch(sql1); ocF>LR%P
sm.addBatch(sql2); _.{zpF=j
... !EOQhh
sm.executeBatch() mQ}Gh_'ps
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 kn}zgSO
2、PreparedStatement o@9+mM"B)
PreparedStatement ps = cn.preparedStatement(sql); w?*z^y@
{ w$j{Hp6m
ps.setXXX(1,xxx); ~^&R#4J
... II;Te7~
ps.addBatch(); TnNWO+kg
} HY ;9?KJ'
ps.executeBatch(); .k@^KY
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gfde#T)S
KY$k`f6?P
事务的处理 '. (~
1、关闭Connection的自动提交 BFWi(58q
cn.setAutoCommit(false); WuM C^
2、执行一系列sql语句 r?p[3JJ;mG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close EyY],W1 Y
Statement sm ; ^gOww6$ <
sm = cn.createStatement(insert into user...); Z~p!C/B
sm.executeUpdate(); zBY~lNB
sm.close(); t<63 8`{kk
sm = cn.createStatement("insert into corp...); q$gz_nVq,b
sm.executeUpdate(); nIn2 *r
sm.close(); R`#W wx>b
3、提交 oQT2S>cm^
cn.commit(); :"QfF@Z{
4、如果发生异常,那么回滚 NQX>Qh
2
cn.rollback();