java 数据库基本操作 'gUHy1p
1、java数据库操作基本流程
&
?/h5<
2、几个常用的重要技巧: YM3oqS D
可滚动、更新的记录集 ]j*o&6cQf
批量更新 Xu3^tH-b<
事务处理 [H0jDbN
tFwQ /
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 \b.2f+;3
1、取得数据库连接 "M7ry9dDH
1)用DriverManager取数据库连接 Lr)h>j6\
例子
L]9!-E
String className,url,uid,pwd; PHDKx+$
className = "oracle.jdbc.driver.OracleDriver"; s[nOB0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $7TYix8=
uid = "system"; uP|AP
pwd = "manager"; Vt
n$*ML
Class.forName(className); &BG^:4b
Connection cn = DriverManager.getConnection(url,uid,pwd); ~#I1!y~`
2)用jndi(java的命名和目录服务)方式 O~{Zs\u9
例子 Xe=@I*
String jndi = "jdbc/db"; xVfJ]Y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uAzVa!)
DataSource ds = (DataSource) ctx.lookup(jndi); t1Hd-]28V
Connection cn = ds.getConnection(); q5lRc=.b[
多用于jsp中 1Na CGD"
2、执行sql语句 '9auQ(2
1)用Statement来执行sql语句 A6lf-8ncx
String sql; feNr!/
Statement sm = cn.createStatement(); 6 Y&OG>_\
sm.executeQuery(sql); // 执行数据查询语句(select) TQ=\l*R(A
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); lqX]'gu]\
2)用PreparedStatement来执行sql语句 Rr%]/%
String sql; DbPw)aCj
sql = "insert into user (id,name) values (?,?)"; 8x58sOR=
PreparedStatement ps = cn.prepareStatement(sql); L}>9@?;GW
ps.setInt(1,xxx); cB.v&BSW
ps.setString(2,xxx); En5Bsz!
... m|24)%Vj;=
ResultSet rs = ps.executeQuery(); // 查询 }5Y.N7F
int c = ps.executeUpdate(); // 更新 &`@,mUi{Ac
1(q!.lPc
3、处理执行结果 H1\~T
查询语句,返回记录集ResultSet C9gF2ii|?
更新语句,返回数字,表示该更新影响的记录数 deHBY4@
ResultSet的方法 ywq{9)vq
1、next(),将游标往后移动一行,如果成功返回true;否则返回false lG\lu'<C
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 q n =6>wP
gjo\gP@
4、释放连接 @sfV hWG
cn.close(); \VtCkb
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection YLPiK
H@G7oK
可滚动、更新的记录集 iY;)R|6
1、创建可滚动、更新的Statement Kwh3SU=L}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Oo7n_h1
该Statement取得的ResultSet就是可滚动的 G92=b*x/
2、创建PreparedStatement时指定参数 N1LR _vS"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); XHN?pVZ7
ResultSet.absolute(9000); R#1m_6I
批量更新 Hd;>k$B
1、Statement ? ~_%I
Statement sm = cn.createStatement(); Lb2Bu >
sm.addBatch(sql1); NNe'5q9
sm.addBatch(sql2); z W+wtYV4
... ,0-
sm.executeBatch() 4RTEXoXs
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 YnJ=&21
2、PreparedStatement ? _HTOOa
PreparedStatement ps = cn.preparedStatement(sql); !o*oT}6n
{ j:<E=[Kl
ps.setXXX(1,xxx); i]Kq
... %#7M~RB[
ps.addBatch(); 1ed#nB%
} j1/J9F'
ps.executeBatch(); F!fxA#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 HO' ELiZ_q
:dLS+cTC
事务的处理 m{b(^K9}
1、关闭Connection的自动提交 2a?
d:21 B
cn.setAutoCommit(false); ge[\%
2、执行一系列sql语句 D;Az>]>q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close UKX'A)$
Statement sm ; F+hsIsQ
sm = cn.createStatement(insert into user...); [;|g2\
sm.executeUpdate(); pMX7Rl
sm.close(); _^SNI ~
sm = cn.createStatement("insert into corp...); X-n'?=
sm.executeUpdate(); m1+DeXR_g
sm.close(); W9eR3q
3、提交 RCxqqUS\C
cn.commit(); hfEGkaV._3
4、如果发生异常,那么回滚 .'X$SF`
cn.rollback();