java 数据库基本操作 2z*}fkJ
1、java数据库操作基本流程 ,}\LC;31,
2、几个常用的重要技巧: @sG*u >
可滚动、更新的记录集 t{yj`Vg
批量更新 +pq)
7
事务处理 z6 }p4
Vpp$yM&?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 dH.Fb/7f
1、取得数据库连接 w_o+;B|I
1)用DriverManager取数据库连接 bl&9O
例子 YhNrg?nS
String className,url,uid,pwd; P>u2""c
className = "oracle.jdbc.driver.OracleDriver"; )5n0P
Zi
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0<:rp]<,
uid = "system"; P5h*RV>oS
pwd = "manager"; ?mM:oQH+>
Class.forName(className); X3 1%T"
Connection cn = DriverManager.getConnection(url,uid,pwd); T[^&ZS]s
2)用jndi(java的命名和目录服务)方式 4CchE15
例子 34X]b[^
String jndi = "jdbc/db"; jygUf|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); utRO?]%d
!
DataSource ds = (DataSource) ctx.lookup(jndi); [TQYu:e
Connection cn = ds.getConnection(); Ky7.&6\n
多用于jsp中 Q|P
M6ta
2、执行sql语句 WMnSkO
1)用Statement来执行sql语句 7D,nxx(`
String sql; s-5#P,Lw
Statement sm = cn.createStatement(); r>! @Z2%s
sm.executeQuery(sql); // 执行数据查询语句(select) {ZSAPq4)L
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
Ip`1Wv_
2)用PreparedStatement来执行sql语句 yUf`L=C:
String sql; b$0;fEvIJn
sql = "insert into user (id,name) values (?,?)"; Q!3-P
PreparedStatement ps = cn.prepareStatement(sql); ZbVn"he
ps.setInt(1,xxx); )X," NJG
ps.setString(2,xxx); y`8U0TE3R
... Ym"^Ds}
ResultSet rs = ps.executeQuery(); // 查询 ]hy@5Jyh
int c = ps.executeUpdate(); // 更新 Du
+_dr^4
Z2@e~&L
3、处理执行结果 fd #QCs
查询语句,返回记录集ResultSet xjF>AAM_Px
更新语句,返回数字,表示该更新影响的记录数 g]JRAM
ResultSet的方法 AcEz$wy
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Tc!n@!RA|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *~4<CP+"0
AV|:v3
4、释放连接 yPT o,,ca=
cn.close(); 5D=U.UdR
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ]@cI _n
d&L
可滚动、更新的记录集 r_ +!3
1、创建可滚动、更新的Statement olr#3te
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); N.+A-[7,W
该Statement取得的ResultSet就是可滚动的 5#x[rr{^*
2、创建PreparedStatement时指定参数 9>0OpgvC(
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); nu:l;+,VY
ResultSet.absolute(9000); Sh5)36
批量更新 h5T~dGRlR
1、Statement 0}`.Z03fy
Statement sm = cn.createStatement(); [_`yy
sm.addBatch(sql1); !-n*]C
sm.addBatch(sql2); >);M\,1\I
... sw}^@0ua=
sm.executeBatch() ^i8biOSZu
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 rN7JJHV
2、PreparedStatement )g?jHm-p\
PreparedStatement ps = cn.preparedStatement(sql); \v+c.
{ )(yaX
ps.setXXX(1,xxx); *Q?8OwhJ
... )Ghw!m
ps.addBatch(); {S-M] LE
} J E5qR2VA
ps.executeBatch(); Z_dL@\#|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 K:qc
"Q=C
vol (%wB
事务的处理 },}g](!m
1、关闭Connection的自动提交 ]8OmYU%6V
cn.setAutoCommit(false); h+!R)q8M
2、执行一系列sql语句 wj0_X;L
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
LjEMs\P\
Statement sm ; +:jv )4^O
sm = cn.createStatement(insert into user...); 6C"zBJcGc
sm.executeUpdate(); Y1>OhHuN
sm.close(); RTbV!I
sm = cn.createStatement("insert into corp...); rx;;|eb,
sm.executeUpdate(); zsd<0^
p\{
sm.close(); ZybfqBTD&c
3、提交 Wl=yxJu_(
cn.commit(); TG8 U=9qt
4、如果发生异常,那么回滚 vfj{j=
G
cn.rollback();