java 数据库基本操作 kW`r= u
1、java数据库操作基本流程 5jgdbHog]
2、几个常用的重要技巧: j}BHj.YuP
可滚动、更新的记录集 { F'Kk\f%:
批量更新 ?\U!huu
事务处理 yJsH=5A
Nrah;i+H\o
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Gy,u^lkk:
1、取得数据库连接 ~XydQJ^*
1)用DriverManager取数据库连接 9D 0dg(
例子 -UZ@G~K
String className,url,uid,pwd; F,GN[f-
className = "oracle.jdbc.driver.OracleDriver"; 4D$;KokZ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; g|Y] wd
uid = "system"; tM,%^){p$
pwd = "manager"; 'JdkUhq1V
Class.forName(className); 9Ew7A(BG_3
Connection cn = DriverManager.getConnection(url,uid,pwd); B-*E:O0y
2)用jndi(java的命名和目录服务)方式 ewuXpv%vwW
例子 ="%W2
String jndi = "jdbc/db"; `gpQW~*R-;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ExSO|g]%
DataSource ds = (DataSource) ctx.lookup(jndi); FP#FB$eP
Connection cn = ds.getConnection(); !)qQbk
多用于jsp中 e8h,,:l3j
2、执行sql语句 '~ 4pl0TWc
1)用Statement来执行sql语句 T"T;`y@(
String sql; 1AHx"e,;L
Statement sm = cn.createStatement(); g7CXlT0Q6
sm.executeQuery(sql); // 执行数据查询语句(select) W%e_~$H0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Sf/q2/r?6[
2)用PreparedStatement来执行sql语句 joXfmHB}
String sql; 16X@^j_
sql = "insert into user (id,name) values (?,?)"; PF`rWw
PreparedStatement ps = cn.prepareStatement(sql); J9%@VZut
ps.setInt(1,xxx); <&pKc6+{
ps.setString(2,xxx); GIftrYr
... *U=]@I}J
ResultSet rs = ps.executeQuery(); // 查询 C#i UP|7hh
int c = ps.executeUpdate(); // 更新 H^~.mBP
n
-fgC"2H
3、处理执行结果
sM\lO
查询语句,返回记录集ResultSet dQgk.k
更新语句,返回数字,表示该更新影响的记录数 m,>
ResultSet的方法 p<`+sf}A:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false s$DrR
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 L{ho*^b
?$z.K>S5
4、释放连接 2X88:
cn.close(); V (rr"K+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection g,]@4|
W~ULc9
可滚动、更新的记录集 6QZ5|T ]
1、创建可滚动、更新的Statement ~|Z'l%<Os
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); s?3i)Ymr
该Statement取得的ResultSet就是可滚动的 Y-~~,Yl~
2、创建PreparedStatement时指定参数 G{x[uE2X&f
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); a
:HNg
ResultSet.absolute(9000); ;`v% sx#
批量更新 wP"q<W
g
1、Statement K{cbn1\,H
Statement sm = cn.createStatement(); cPn+<M#
sm.addBatch(sql1); ,>LRa
sm.addBatch(sql2); u-DK_^v4M
... Rt(J/%;
sm.executeBatch() J?n<ydZSH
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Zt@Z=r:&
2、PreparedStatement Gzt=u"FV
PreparedStatement ps = cn.preparedStatement(sql); f+Dn9t
{ w7-WUvxl
ps.setXXX(1,xxx); XD-^w_
... ] c}91
ps.addBatch(); JmOW~W
} 5IqQ |/m<6
ps.executeBatch(); fT
Y/4(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !q4x~G0d
%do1i W
事务的处理 h4fLl3%H
1、关闭Connection的自动提交 pKJK9@Ad
cn.setAutoCommit(false); LD (C\
2、执行一系列sql语句 V/"}ku
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close TSL9ax4j
Statement sm ; 7\/5r.
sm = cn.createStatement(insert into user...); 4p) e}W*
sm.executeUpdate(); $E(XjuS
sm.close(); uCzii o`S
sm = cn.createStatement("insert into corp...); Y:x/!-
sm.executeUpdate(); O.k\]'
sm.close(); zuL7%qyv
3、提交 ,
fb(
WY
cn.commit(); */ OI*{Q
4、如果发生异常,那么回滚 %85Icg
cn.rollback();