java 数据库基本操作 nW`EBs
1、java数据库操作基本流程 txXt<]N
2、几个常用的重要技巧: ]*JH~.p
可滚动、更新的记录集 7.tEi}O&_g
批量更新 gVI2{\a
事务处理 d]w%zo,yr
yaKw/vV
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 bcC+af0L
1、取得数据库连接 Ve^rzGU
1)用DriverManager取数据库连接 r&c31k]E
例子 Z7Xic5PI{4
String className,url,uid,pwd; ~Y'j8W
className = "oracle.jdbc.driver.OracleDriver"; YR}By;Bq
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; L% ?3VW
uid = "system"; 9V( esveq
pwd = "manager"; YUsMq3^&
Class.forName(className); m kHcGB!~
Connection cn = DriverManager.getConnection(url,uid,pwd); 3Mt Alc0xp
2)用jndi(java的命名和目录服务)方式 x$Tf IFy
例子 =
~^
String jndi = "jdbc/db"; MJ0UZxnl
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~6-6aYhe
DataSource ds = (DataSource) ctx.lookup(jndi); h`b[c.%
Connection cn = ds.getConnection(); *]RCfHo\=
多用于jsp中 %e'Z.vm
2、执行sql语句 , 1`-u$
1)用Statement来执行sql语句 2%(RB4+
String sql; rYwUD7ip
Statement sm = cn.createStatement(); '`fz|.|cbB
sm.executeQuery(sql); // 执行数据查询语句(select) <tp#KZE
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); u.Z,HsEO b
2)用PreparedStatement来执行sql语句 N"q C-h
String sql; e3b|z.^ 8
sql = "insert into user (id,name) values (?,?)"; 6`l7saHXE
PreparedStatement ps = cn.prepareStatement(sql); WYNO6Xb#:
ps.setInt(1,xxx); T&PLvyBL
ps.setString(2,xxx); |8YP8o
... {r2fIj~V
ResultSet rs = ps.executeQuery(); // 查询 8'6$t@oT9w
int c = ps.executeUpdate(); // 更新 Jh)K0>R
cPm-)/E)i
3、处理执行结果 OGqsQ
查询语句,返回记录集ResultSet fK{[=xMr@
更新语句,返回数字,表示该更新影响的记录数 =j{r95)|u
ResultSet的方法 b&1-tYV
1、next(),将游标往后移动一行,如果成功返回true;否则返回false nfbq J
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 c/\$AJV.H
#\)tz z
4、释放连接 :[ AP^
cn.close(); u t4+c0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,Y3wXmG
I_h{n{,sr
可滚动、更新的记录集 ZT'Sw%U:
1、创建可滚动、更新的Statement X0"f>.Lg
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); hpVu
该Statement取得的ResultSet就是可滚动的 7yK1Q_XY>
2、创建PreparedStatement时指定参数 8${Yu
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); eX@7f!uz
ResultSet.absolute(9000); Vdz(\-}ao
批量更新 GxR, 3
1、Statement {BlKVsQ
Statement sm = cn.createStatement(); U\\nSU
sm.addBatch(sql1); ,@'M'S
sm.addBatch(sql2); xFY<
ns
... ~1yMw.04V
sm.executeBatch() bhb*,iWA
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !(wH}ti
2、PreparedStatement k;9"L90
PreparedStatement ps = cn.preparedStatement(sql); 2og8VI
{ GXE6=BO
ps.setXXX(1,xxx); @\UoZv(
... >)IXc<"wq
ps.addBatch(); 7berkU0P
} %g<J"/
ps.executeBatch(); }_{QsPx9
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。
(s\":5
C
0fd\R_"d.
事务的处理 > \KVg(?D
1、关闭Connection的自动提交 FTg4i\Wp
cn.setAutoCommit(false); ,LHQ@/}A C
2、执行一系列sql语句 r
7mg>3
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close K{s%h0
Statement sm ; 2i@t;h2E
sm = cn.createStatement(insert into user...); !&Z,ev
sm.executeUpdate(); U5z}i^8a
sm.close(); N3`W%ws`~
sm = cn.createStatement("insert into corp...); 2%DleR'i
sm.executeUpdate(); gxku3<S
sm.close(); +L$,jZqS
3、提交 Kx;DmwX-
cn.commit(); OJ'x>kE
4、如果发生异常,那么回滚 oe5.tkc
cn.rollback();