java 数据库基本操作 joe)b
1、java数据库操作基本流程 j*.;6}\o
2、几个常用的重要技巧: a}UmD
HS-
可滚动、更新的记录集 Jy(G
A
批量更新 GL
n M1
事务处理 {+J{t\`
PJ5}c!o[
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 3]*Kz*i
1、取得数据库连接 ^FLs_=E
1)用DriverManager取数据库连接 tl0|.Q,
例子 hE&6;3">
String className,url,uid,pwd; es)^^kGj6f
className = "oracle.jdbc.driver.OracleDriver"; `s7pM
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; aw*]b.f
uid = "system"; DB|1Sqjsn
pwd = "manager"; ^ptybVo
Class.forName(className); JN
wI{
Connection cn = DriverManager.getConnection(url,uid,pwd); PeJ#9hI~rQ
2)用jndi(java的命名和目录服务)方式 njs:
例子 ^%7(
String jndi = "jdbc/db"; ]rv\sD`[
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); !6(3Y
DataSource ds = (DataSource) ctx.lookup(jndi);
V9) /
Connection cn = ds.getConnection(); gcA:Q4
多用于jsp中 ^-"Iwy
2、执行sql语句 "9caoPI0~
1)用Statement来执行sql语句 AT&K> NG
String sql; jrQ0-D%M d
Statement sm = cn.createStatement();
>Z!!` 0{
sm.executeQuery(sql); // 执行数据查询语句(select) #^T`vTD-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); z=>fBb>w7
2)用PreparedStatement来执行sql语句 G&*P*f1S
String sql; 23?u_?+4i
sql = "insert into user (id,name) values (?,?)"; c>LP}PGk
PreparedStatement ps = cn.prepareStatement(sql); &>\;4E.O5
ps.setInt(1,xxx); a3yNd
ps.setString(2,xxx); 1/97_:M0~F
... <st<oR'
ResultSet rs = ps.executeQuery(); // 查询 roQI;gq^
int c = ps.executeUpdate(); // 更新 V?Jy
$S#Z>d*1!
3、处理执行结果 4A2}3$c9
查询语句,返回记录集ResultSet HP8J\`
更新语句,返回数字,表示该更新影响的记录数 r
XJx~
g
ResultSet的方法 _KM?
?&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false }B-$}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 30sJ"hF9
QD@O!};
T
4、释放连接 ?\Z pVL<>
cn.close(); w
% Hj'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection M@.l#
[@U
j-K[]$
可滚动、更新的记录集 H^-Y]{7
1、创建可滚动、更新的Statement :+"4_f0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); MqZ"Js
该Statement取得的ResultSet就是可滚动的 4t[7lL`Z
2、创建PreparedStatement时指定参数 U6&`s%mIa
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ,iyy2
ResultSet.absolute(9000); tc'iKJ5)
批量更新 :H&Q!\a
1、Statement uz!8=,DFw
Statement sm = cn.createStatement(); p7|I>8ur.
sm.addBatch(sql1); d'';0[W)
sm.addBatch(sql2); }k }=e
... nYx
/q
sm.executeBatch()
o
]*yI[\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 x {NBhq(4
2、PreparedStatement GJ%^hr`P
PreparedStatement ps = cn.preparedStatement(sql); E*YmHJ:k
{ B=cA$620
ps.setXXX(1,xxx); Ic0Sb7c
... /GgID!8
ps.addBatch(); D)-LZbPa
} @6"MhF
ps.executeBatch(); p :xyy*I
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2PQBUq
rnK]3Ust
事务的处理 Wr[LC&
1、关闭Connection的自动提交 x Q"uC!Gu4
cn.setAutoCommit(false); q1VKoKb6\:
2、执行一系列sql语句 T~xVHk1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |qX?F`
Statement sm ; a[K&;)
sm = cn.createStatement(insert into user...); \Eh5g/,[
sm.executeUpdate(); Zv
%>m
sm.close(); LaJvPOQ
sm = cn.createStatement("insert into corp...); J&aN6 l?
sm.executeUpdate(); $]|3^(y``
sm.close(); gCghWg{S
3、提交 ]H/,Q6Q
cn.commit(); pb97S^K[
4、如果发生异常,那么回滚 UCVYO.
9"
cn.rollback();