java 数据库基本操作 O))YJh"'_
1、java数据库操作基本流程 at+Nd K
2、几个常用的重要技巧: )^`V{iD
可滚动、更新的记录集
m:D0O]2
批量更新 _iF*BnmN
事务处理 9RPZj>ezjA
-A,UqEt
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 C
%i{{Y&l
1、取得数据库连接 9$#@Oe8*
1)用DriverManager取数据库连接
^o87qr0g]
例子 }nRTw2-z
String className,url,uid,pwd; Ih HKRb[
className = "oracle.jdbc.driver.OracleDriver"; b]4\$ rW7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; tR\cS)
uid = "system"; IP
pwd = "manager"; 9~J#> C0}
Class.forName(className); (?xR<]~g*
Connection cn = DriverManager.getConnection(url,uid,pwd); t3b M4+n
2)用jndi(java的命名和目录服务)方式 jf.WmiDC
例子 y(wb?86#W5
String jndi = "jdbc/db"; _fdD4-2U
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); t)5.m}
DataSource ds = (DataSource) ctx.lookup(jndi); R; ui
4wg6
Connection cn = ds.getConnection(); t$3B#=
多用于jsp中 zZW5M^z8
2、执行sql语句 ;$67GK
1)用Statement来执行sql语句 2fgYcQ8`
String sql; q`3HHq
Statement sm = cn.createStatement(); n/{ pQ&B
sm.executeQuery(sql); // 执行数据查询语句(select) Ga_Pt8L6
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); G{!(2D 4!
2)用PreparedStatement来执行sql语句 R7 rO7M!
String sql; _<GXR
?
sql = "insert into user (id,name) values (?,?)"; 2Ab`i!#
PreparedStatement ps = cn.prepareStatement(sql); /:v}Ni"6nF
ps.setInt(1,xxx); v|KGzQx$.*
ps.setString(2,xxx); 'ka}x~EF
... &;bey4_J
ResultSet rs = ps.executeQuery(); // 查询 !"ir}Y%
int c = ps.executeUpdate(); // 更新 CTe!jMZ=
azzG
3、处理执行结果 oE_*hp+
查询语句,返回记录集ResultSet j/jFS]iC
更新语句,返回数字,表示该更新影响的记录数 (f2r4Io|}
ResultSet的方法 Xf{9rZ+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9{}"tk5$h
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =
c1>ja
iL!4r]~H
4、释放连接 l<qEX O
cn.close(); (+6N)9rj`/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,|GjrT{vf
;<*%BtD?
可滚动、更新的记录集 9f/l"
1、创建可滚动、更新的Statement Qp7F3,/#
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6XHM `S
该Statement取得的ResultSet就是可滚动的 gb4$W@N7V
2、创建PreparedStatement时指定参数 d+vAm3.Dg
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 6b%IPbb
ResultSet.absolute(9000); N{}8Zh4op
批量更新 ;n.h !wmJ}
1、Statement -GMaK.4=
Statement sm = cn.createStatement(); ,xR u74
sm.addBatch(sql1); ;W|GUmADf
sm.addBatch(sql2); 7PuYrJ
... ]t~'wL#Z
sm.executeBatch() PJ=| g7I
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 UCup {pDp
2、PreparedStatement AyW=.
PreparedStatement ps = cn.preparedStatement(sql); L&rtN@5;
{ :0ltq><?
ps.setXXX(1,xxx); sIbPMu`&U
... &EYoviFp
ps.addBatch(); x}O,xquY
} .beqfcj"
ps.executeBatch(); 8GRB6-.h
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .S1MxZhbP
tSnsjd<6.
事务的处理 :xTm-L
1、关闭Connection的自动提交 0~+*$W
cn.setAutoCommit(false); <o[3*59
2、执行一系列sql语句 Kv:Rvo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close x4MTE?hT
Statement sm ; H+5+;`;
sm = cn.createStatement(insert into user...); p-lFzNPc0
sm.executeUpdate(); Sk C.A?
sm.close(); wW8[t8%43
sm = cn.createStatement("insert into corp...); MslgQmlM
sm.executeUpdate(); @v:Eh
sm.close(); _"OE}$C
3、提交 ]5K(}95&'
cn.commit(); n(|n=P:o
4、如果发生异常,那么回滚 |H]0pbC)w
cn.rollback();