java 数据库基本操作 RS@[ +! :t
1、java数据库操作基本流程 4TYtgP1
2、几个常用的重要技巧: Az-!X!O*f
可滚动、更新的记录集 ,6o tm
批量更新 @sW!g;\T
事务处理 PIdGis5G
<
+kdL
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @yC3a)=$L
1、取得数据库连接 gI"cZ h3}
1)用DriverManager取数据库连接 4j'`,a=
例子 fwlicbs '
String className,url,uid,pwd; VDxF%!h(
className = "oracle.jdbc.driver.OracleDriver"; BR_fOIDc
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; TQPrOs?
uid = "system"; %;|dEY
pwd = "manager"; 6{0MprY
Class.forName(className); $*LBZcL
Connection cn = DriverManager.getConnection(url,uid,pwd); /8<c~
2)用jndi(java的命名和目录服务)方式 S]Di1E^r;_
例子 U3{4GmrT
String jndi = "jdbc/db"; YK5(o KFN
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [=tIgMmz
DataSource ds = (DataSource) ctx.lookup(jndi); {[hgSVN;
Connection cn = ds.getConnection(); `U|zNizO
多用于jsp中 0cVxP)J+
2、执行sql语句 mIPDF1=)
1)用Statement来执行sql语句 {+[Ex2b$
String sql; j(}pUV B
Statement sm = cn.createStatement(); WF_QhKW|k
sm.executeQuery(sql); // 执行数据查询语句(select)
Mz+vT0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )vpYVr-
2)用PreparedStatement来执行sql语句 wQ~]VVRN
String sql; rq Uk_|Xa
sql = "insert into user (id,name) values (?,?)"; /0$405
PreparedStatement ps = cn.prepareStatement(sql); 8TK*VOf`
ps.setInt(1,xxx); O%6D2d
ps.setString(2,xxx); u } +?'B)
... FvO,* r9
ResultSet rs = ps.executeQuery(); // 查询 ,yvS c
int c = ps.executeUpdate(); // 更新 tOxH 9
d0&
3、处理执行结果 mahNQ5 W*)
查询语句,返回记录集ResultSet )heHERbJ
更新语句,返回数字,表示该更新影响的记录数 ,}"jiGgS4
ResultSet的方法 @ &Od1X
1、next(),将游标往后移动一行,如果成功返回true;否则返回false MJCz %zK
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ZLdIEBi=
XHOS"o$y
4、释放连接 l N0u1)'2
cn.close(); *-uzsq.W
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection wh2E$b(-
@,-D
P41g
可滚动、更新的记录集 O{Mn\M6
1、创建可滚动、更新的Statement shP}T[<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F2ISg'
该Statement取得的ResultSet就是可滚动的 z#rp8-HUDS
2、创建PreparedStatement时指定参数 ;>;it5 l=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2-Wy@\
ResultSet.absolute(9000); >oaL -01i
批量更新 o^MoU2c
1、Statement 3 TTQff
Statement sm = cn.createStatement(); zSu,S4m_;
sm.addBatch(sql1); K5t.OAA:
sm.addBatch(sql2); E7_OI7C
... '#eT
sm.executeBatch() )qOcx
I
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H
SGz-
2、PreparedStatement ,A)Z.OWOq
PreparedStatement ps = cn.preparedStatement(sql); /L5:/Z
{ q_mxZM
->
ps.setXXX(1,xxx); 3-)}.8F
... uPxjW"M+
ps.addBatch(); g5u4|+70
} TIR Is1
ps.executeBatch(); (<-m|H};
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 pn){v
mEkYT
事务的处理 {MTtj4$
1、关闭Connection的自动提交 (d
(>0YMv
cn.setAutoCommit(false); 8V9OMOt!
2、执行一系列sql语句 =dQ/^C_hj
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 4\g[&
Statement sm ; !^v~hD$_q
sm = cn.createStatement(insert into user...); :^xNHMp!
sm.executeUpdate(); *[BtW56-
sm.close(); i1A<0W|
sm = cn.createStatement("insert into corp...); v-^tj}jA
sm.executeUpdate(); fakad#O
sm.close(); t5u#[*
3、提交 wu &lG!#
cn.commit(); VeZd\Oe
4、如果发生异常,那么回滚 *!{&n*N
cn.rollback();