java 数据库基本操作 n+ot. -
1、java数据库操作基本流程 :[hZn/
2、几个常用的重要技巧: e7T}*Up
可滚动、更新的记录集 C 2$_Ad=s
批量更新 ihv=y\Jt
事务处理 l y!vbpE_
BYhF?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ao+lLCr
1、取得数据库连接 D's Tv}P
1)用DriverManager取数据库连接 I-L52%E]
例子 7FQ&LF46
String className,url,uid,pwd; i .O670D
className = "oracle.jdbc.driver.OracleDriver"; A>C&`A=-
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _zuaImJ0o
uid = "system"; `a$c6^a
pwd = "manager"; HUP~
Class.forName(className); p,(gv])ie
Connection cn = DriverManager.getConnection(url,uid,pwd); Nft~UggK
2)用jndi(java的命名和目录服务)方式 4Z'/dI`
例子 !c 3c%=W
String jndi = "jdbc/db"; !xqy6%p
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); NVt612/'7y
DataSource ds = (DataSource) ctx.lookup(jndi); 9FGe(t<
Connection cn = ds.getConnection(); *wvd[q h
多用于jsp中 *9XKkR<r
2、执行sql语句 QQ*`tmy
1)用Statement来执行sql语句 o#p{0y
String sql; RB,`I#z1f
Statement sm = cn.createStatement(); @ PboT1
sm.executeQuery(sql); // 执行数据查询语句(select) \B72 #NR
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); iZ^tLnc
2)用PreparedStatement来执行sql语句 n5Coxvy1
String sql; 0.MD_s0)>
sql = "insert into user (id,name) values (?,?)"; IjshxNk
PreparedStatement ps = cn.prepareStatement(sql); /b|V=j}W
ps.setInt(1,xxx); 7?1[sPM
ps.setString(2,xxx); d*}dM"
... ]U4)2s
ResultSet rs = ps.executeQuery(); // 查询 x6h';W_ 8
int c = ps.executeUpdate(); // 更新 @pV~Q2%
Lo<-;;vQ
3、处理执行结果 vZ&{
查询语句,返回记录集ResultSet jV}tjwq
更新语句,返回数字,表示该更新影响的记录数 *6C ]CS
ResultSet的方法 LBcnBo</v
1、next(),将游标往后移动一行,如果成功返回true;否则返回false j3W)
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Ht{Q=w/9
<6!;mb
;cX
4、释放连接 ?QJS6i'k
cn.close(); hggP9I:s,
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection IasWm/
Rhfx
可滚动、更新的记录集 5.IX
1、创建可滚动、更新的Statement tz6N,4J?
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); t)p . $
该Statement取得的ResultSet就是可滚动的 I`% ]1{
2、创建PreparedStatement时指定参数 UPE9e
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); XABB6J]
ResultSet.absolute(9000); goMv8d
批量更新 0=:]tSD\F
1、Statement
spX*e1
Statement sm = cn.createStatement(); .kl.awT
sm.addBatch(sql1); e>6NO
sm.addBatch(sql2); dcn/|"jr
... Ifx
EM
sm.executeBatch() g"KH~bN
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ]"wl*$N
2、PreparedStatement C6PlO
PreparedStatement ps = cn.preparedStatement(sql); 5s7C;+
{ z1AYXW6F
ps.setXXX(1,xxx); 1ZrJ7a7=
... #M)SAe2
ps.addBatch(); $2kZM4
} ;YfKG8(0
ps.executeBatch(); :`Z'vRj
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m9Pzy^g1
,f[`C-\Q%
事务的处理 \nzaF4+$
1、关闭Connection的自动提交 C"gH>G
cn.setAutoCommit(false); 0etJ, _">
2、执行一系列sql语句 3g{T+c*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;^"#3_7T]
Statement sm ; SjmWlf,
sm = cn.createStatement(insert into user...); 2[V9`r8*
sm.executeUpdate(); qQ{i2D%)?f
sm.close(); 5McOSy
sm = cn.createStatement("insert into corp...); U65a_dakk
sm.executeUpdate(); LQo>wl
sm.close(); I'%\
E,
3、提交 fZ6-ap,u
cn.commit(); 5bZjW~d
4、如果发生异常,那么回滚 ,zP.ch0K
cn.rollback();