java 数据库基本操作 R3_OCM_*
1、java数据库操作基本流程 qKd ="PR}
2、几个常用的重要技巧: *`u|1}h|
可滚动、更新的记录集 iw/~t
批量更新 a'jUM+D;
事务处理 TY %zw6 #p
lkTA"8d
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 iv +a5
1、取得数据库连接 g_c@Kyf
1)用DriverManager取数据库连接 77[TqRLf
例子 ;k `51=Wi
String className,url,uid,pwd; !;*flr`/
className = "oracle.jdbc.driver.OracleDriver"; b_F1?:#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; )2Sh oFF
uid = "system"; v5a\}S<(
pwd = "manager"; Ly8=SIZ
Class.forName(className); bHRn}K+<}c
Connection cn = DriverManager.getConnection(url,uid,pwd); Uvm.|p_V
2)用jndi(java的命名和目录服务)方式 I@Hx
LEGj
例子 iu8Q &Us0P
String jndi = "jdbc/db"; Sxc)~y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); .uauSx/#4
DataSource ds = (DataSource) ctx.lookup(jndi); TaYl[I
Connection cn = ds.getConnection(); V;MmPNP|
多用于jsp中 ;a1DIUm'
2、执行sql语句 q C cLd7`$
1)用Statement来执行sql语句 B<r0y
String sql; |X:`o;Uma
Statement sm = cn.createStatement(); uXFI7vV6P
sm.executeQuery(sql); // 执行数据查询语句(select) /mz.HCs
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Ro9:kEG$
2)用PreparedStatement来执行sql语句 z*jaA;#
String sql; |}:}14ty
sql = "insert into user (id,name) values (?,?)"; &nr{-][
PreparedStatement ps = cn.prepareStatement(sql); ^P~,bO&H.Z
ps.setInt(1,xxx); vi^YtA
ps.setString(2,xxx); _";w*lg}
... rrRv 7J&Q
ResultSet rs = ps.executeQuery(); // 查询 o5&b'WUJ=
int c = ps.executeUpdate(); // 更新 :
pUu_
.tG3g:
3、处理执行结果 ,hI$nF0}p
查询语句,返回记录集ResultSet [q!]Ds"
_
更新语句,返回数字,表示该更新影响的记录数 Gn^lF7yE
ResultSet的方法 @br)m](@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false vb>F)po1}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ,
p}:?uR
W+Mw:,>*s
4、释放连接 xS12$ib ~G
cn.close(); /}E2Rr?{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection su=MMr>
[06m{QJ)1
可滚动、更新的记录集 lmHQ"z 3G
1、创建可滚动、更新的Statement iy]L"7&Z2
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #2%V
该Statement取得的ResultSet就是可滚动的 W|fE]RY
2、创建PreparedStatement时指定参数 h.#:7d(g
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;E
9o%f:o
ResultSet.absolute(9000); HoAg8siQ
批量更新 RRS)7fFm
1、Statement D`^wj FF
Statement sm = cn.createStatement(); M&/4SVBF
sm.addBatch(sql1); 9yTdbpY
sm.addBatch(sql2); JW0\y+o~
... q7KHx b
sm.executeBatch() ),`jMd1`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 a_}C*+D
2、PreparedStatement J61%a,es
PreparedStatement ps = cn.preparedStatement(sql); &PV%=/-J
{ tL;.vRx
ps.setXXX(1,xxx); ;yNY/
... v]on0Pi!
ps.addBatch(); .-HM{6J
} };rp25i
ps.executeBatch(); _ s}aF
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !Ltx2CB2]
)=}qAVO8
事务的处理 jSvq1$U
1、关闭Connection的自动提交 $*X?]?
cn.setAutoCommit(false); f9#srIx+
2、执行一系列sql语句 n.9k5r@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close V*rLGY#
Statement sm ; jq]5Y^e
sm = cn.createStatement(insert into user...); ",aNYJR>*!
sm.executeUpdate(); `]l`t"x
sm.close(); x#SE%j?
sm = cn.createStatement("insert into corp...); jRiMWolLv
sm.executeUpdate(); EgPL+qL
sm.close(); o%j?}J7y
3、提交 C1_0 9Vc
cn.commit(); [7PC\
4、如果发生异常,那么回滚 6 M:?W"
cn.rollback();