java 数据库基本操作 RVKaqJ0e<
1、java数据库操作基本流程 m+gG &`&u
2、几个常用的重要技巧: X)R]a]1A
可滚动、更新的记录集 !\k#{
1[!
批量更新 y88}f&z#5
事务处理 I\4`90uBN
X9`C2fyVd
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :;#}9g9
1、取得数据库连接 "}x70q'>S
1)用DriverManager取数据库连接 `_{'?II
例子 \3Ald.EqtM
String className,url,uid,pwd; kA:;c}p
className = "oracle.jdbc.driver.OracleDriver"; L!8?2 \5
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ew,wNR`
uid = "system"; *1$~CC7
pwd = "manager"; .L TFa.jxA
Class.forName(className); O>):^$-K%
Connection cn = DriverManager.getConnection(url,uid,pwd); KZ
>"L
2)用jndi(java的命名和目录服务)方式 }Yl8Q>t
例子 "s6_lhu=E7
String jndi = "jdbc/db"; BRok 89
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); H><mcah
DataSource ds = (DataSource) ctx.lookup(jndi); 9kg>)ty@
Connection cn = ds.getConnection(); ]A<u eM
多用于jsp中 ?bYQZJ>&
2、执行sql语句 F-\8f(\
1)用Statement来执行sql语句 C%7)sLWjJS
String sql; X1z0'gvh
Statement sm = cn.createStatement(); ]}Hv,a
sm.executeQuery(sql); // 执行数据查询语句(select) ^d$e^cU
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); AkQFb2|ir
2)用PreparedStatement来执行sql语句 iuk8c.TAR
String sql; mS;Q8Crh
sql = "insert into user (id,name) values (?,?)"; :<7>-+pa
PreparedStatement ps = cn.prepareStatement(sql); V^5k>`A
ps.setInt(1,xxx); 3UtXxL&L`
ps.setString(2,xxx); Mw7UU1 ei
... Q+js2?7^
ResultSet rs = ps.executeQuery(); // 查询 iC0,zk4 &
int c = ps.executeUpdate(); // 更新 ~S{\wL53
ZC-evy
3、处理执行结果 WoG
查询语句,返回记录集ResultSet (']z\4o
更新语句,返回数字,表示该更新影响的记录数 exN#!&;
ResultSet的方法 a|{<#<6n(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false k.R/X
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 pC.P
O*Pe[T5x'
4、释放连接 >;U%~yy}qc
cn.close(); q9z!g/,d/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection r|BKp,u9
{[y"]_B4
可滚动、更新的记录集 ^
J@i7FOb
1、创建可滚动、更新的Statement !Kqj&y5
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); -ddatc|
该Statement取得的ResultSet就是可滚动的 x=|@AFI
2、创建PreparedStatement时指定参数 I:)#U[tn0
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 1`JN
ResultSet.absolute(9000); $[;eb,
批量更新 \J
g#X:d
1、Statement F88SV6
Statement sm = cn.createStatement(); Pw{{+PBu R
sm.addBatch(sql1); @%85k/(
sm.addBatch(sql2); .{ L m
... 3'uES4+r
sm.executeBatch() YZu#0)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 >d[vHyA~!D
2、PreparedStatement }nERQq&A
PreparedStatement ps = cn.preparedStatement(sql); !b8|{#qh.
{ JKv4}bv
ps.setXXX(1,xxx); uXa}<=O
... R,Uy3N
ps.addBatch(); R2f,a*>
} I{UB!0H
ps.executeBatch(); 7ib<Cb>K
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <.XoC?j
,(?4T~
事务的处理 AQGE(%X
1、关闭Connection的自动提交 u+FftgA
cn.setAutoCommit(false); aVL%-Il}
2、执行一系列sql语句 j'b4Sbs-f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -+Ji~;b
Statement sm ; A+*(Pds
sm = cn.createStatement(insert into user...); GB Un" _J
sm.executeUpdate(); ?Og ;W9i
sm.close(); NGGd6V%'-
sm = cn.createStatement("insert into corp...); /P}tgcs
sm.executeUpdate(); :iiTz$yk
sm.close(); pODo[Rkq
3、提交 {%}6d~Bg
cn.commit(); D)$k{v#~
4、如果发生异常,那么回滚 wpMQ 7:j
cn.rollback();