java 数据库基本操作 A.aUWh
1、java数据库操作基本流程 J. ;9-
2、几个常用的重要技巧: o ]UG*2
可滚动、更新的记录集 5&WYL
批量更新 N? r{Y$x
事务处理 Byx8`Cx1
q*,g
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 39jnoT
1、取得数据库连接 7^}np^[HB
1)用DriverManager取数据库连接 & 5!.!Z3
例子 !,f{I5/
String className,url,uid,pwd; qJ).;S{AAt
className = "oracle.jdbc.driver.OracleDriver"; ^l}Esz`-M
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ZT>?[`Vgc
uid = "system"; 0_d,sC?V
pwd = "manager"; _^+z2m+~N
Class.forName(className); ZP>KHiA
Connection cn = DriverManager.getConnection(url,uid,pwd); p>w{.hC@
2)用jndi(java的命名和目录服务)方式 NA5AR*f'
例子 ^oNk}:>
String jndi = "jdbc/db"; W`}C0[%VW
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); u{F^Ngy
)
DataSource ds = (DataSource) ctx.lookup(jndi); zmV5k
Connection cn = ds.getConnection(); g3r4>SA
多用于jsp中 1&S34wJF
2、执行sql语句 u)]]9G
_8
1)用Statement来执行sql语句 S GAu.8Js
String sql; Ba=P
Statement sm = cn.createStatement(); 3z^l
sm.executeQuery(sql); // 执行数据查询语句(select) %y(oY
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Rj&V~or
2)用PreparedStatement来执行sql语句 ,2H@xji
[
String sql; O>YXvu
sql = "insert into user (id,name) values (?,?)"; 6$"gm$3O]
PreparedStatement ps = cn.prepareStatement(sql); y6.Q\=
ps.setInt(1,xxx); "i+fO&LpZ
ps.setString(2,xxx); [nQ<pTg~r
... 8*sZ/N.
ResultSet rs = ps.executeQuery(); // 查询 9mdp\A
int c = ps.executeUpdate(); // 更新 _wa1R+`_
Ne^md
3、处理执行结果 !!NVx\a
查询语句,返回记录集ResultSet 2=X\G~a
更新语句,返回数字,表示该更新影响的记录数 x1\a_Kt
ResultSet的方法 PCxv_Svf
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Jvysvi{8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 pNY+ E5
dW3 q
4、释放连接 4~<
:Pj
cn.close(); p=T,JAI t
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ?n$;l-m[
nl9G1Sm(E
可滚动、更新的记录集 Vx1xULdY
1、创建可滚动、更新的Statement }@-4*5P3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ~(2G7x)
该Statement取得的ResultSet就是可滚动的 -rYOx9P4
2、创建PreparedStatement时指定参数 #!,tId
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); n@9*>DU
ResultSet.absolute(9000); <mE)&7C
批量更新 #q`-"2"|
1、Statement ISy\g`d`C
Statement sm = cn.createStatement(); y}NBJ
sm.addBatch(sql1); `'BvUTDyZ
sm.addBatch(sql2); GT|=Kx$;
... AplXl=
sm.executeBatch() pgK)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2=pVX
2、PreparedStatement tlo"tl_]
PreparedStatement ps = cn.preparedStatement(sql); ]|cL+|':y
{ `@MY}/
o.
ps.setXXX(1,xxx); v#EXlpS
... s_} 1J,Y
ps.addBatch(); C^]y
iR-U
} ^cO^3=
ps.executeBatch(); ?(Dk{-:T'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ejYJOTT{^
[ Fid
事务的处理 *c} MI
e'&
1、关闭Connection的自动提交 tA?P$5?-*
cn.setAutoCommit(false); ]HoQ6R\E b
2、执行一系列sql语句 Q/T\Rr_d
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;74hOHDS
Statement sm ; m09
Bds
sm = cn.createStatement(insert into user...); =k]Rze I
sm.executeUpdate(); $Bd{Y"P@6
sm.close(); q=8I0E&q
sm = cn.createStatement("insert into corp...); zItf>j7|Z
sm.executeUpdate(); ;5 W|#{I
sm.close(); RH+3x7l
3、提交 E7E>w#T5
cn.commit(); Bor _Kib
4、如果发生异常,那么回滚 a@_.uD
cn.rollback();