java 数据库基本操作 -3\7vpcdN
1、java数据库操作基本流程 drs-mt8
2、几个常用的重要技巧: V 1*Ad
可滚动、更新的记录集 44Q9 *."
批量更新 |a>}9:g,=*
事务处理 Y.(v{l
S$\.4*_H\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 NA=#>f+U%
1、取得数据库连接 FQ0KUb}0
1)用DriverManager取数据库连接 ~JAjr(G#o
例子 /=q.tDH=I
String className,url,uid,pwd; F G3Sk!O6
className = "oracle.jdbc.driver.OracleDriver"; ,zD_% ox
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; **.:)
uid = "system"; h)^dB,~
pwd = "manager"; RA}U#D:$i
Class.forName(className); wLpkUa
Connection cn = DriverManager.getConnection(url,uid,pwd); }$<^wt
2)用jndi(java的命名和目录服务)方式 k06xz#pL
例子 Ma>:_0I5
String jndi = "jdbc/db"; 6<<'bi
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 5cgo)/3M@}
DataSource ds = (DataSource) ctx.lookup(jndi); )tScc*=8
Connection cn = ds.getConnection(); ' *}^@[&
多用于jsp中 M5F(<,n;
2、执行sql语句 W _J&M4
1)用Statement来执行sql语句 fEB195#@9
String sql; epn#qeX
Statement sm = cn.createStatement(); !O 4<I_EY{
sm.executeQuery(sql); // 执行数据查询语句(select) >dyhox2*"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); is9}ePC7Xu
2)用PreparedStatement来执行sql语句 5GaoJ v
String sql; oPCrD.s
sql = "insert into user (id,name) values (?,?)"; [gpOuTW
PreparedStatement ps = cn.prepareStatement(sql); ]GQv4-y
ps.setInt(1,xxx); tp%|AD"
ps.setString(2,xxx); `bzr_fJ
... &{ DR6
ResultSet rs = ps.executeQuery(); // 查询 1;aF5~&
int c = ps.executeUpdate(); // 更新 ;i.I&*t
~:T3|
3、处理执行结果 r }ZLf
查询语句,返回记录集ResultSet ax4*xxU
更新语句,返回数字,表示该更新影响的记录数 O+p]3u
ResultSet的方法 #FEa 5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false UOw~rK
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |3S'8OeCI
IhUW=1&J
4、释放连接 ,GP!fsK
cn.close(); L'13BRu`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &S<?07Z
K2*1T+?X
可滚动、更新的记录集 I$+%~4
1、创建可滚动、更新的Statement y+?=E g
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +mivqR~{{
该Statement取得的ResultSet就是可滚动的 :G^"e
2、创建PreparedStatement时指定参数 3T"#T&eL
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); HmhUc,EC
ResultSet.absolute(9000); qe[
批量更新 VPWxHVf
1、Statement f( ]R/'o
Statement sm = cn.createStatement(); mPckf
sm.addBatch(sql1); RV(
w%g
sm.addBatch(sql2); %I_&Ehu
... 1po"gVot
sm.executeBatch() "fRlEO[9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ^CfM|L8>
2、PreparedStatement TP~(
r
PreparedStatement ps = cn.preparedStatement(sql); *C5:#A0
{ 1a5?)D
ps.setXXX(1,xxx); U&,r4>V@h>
... 6
M*b 6
ps.addBatch(); r4 9UJE
} ?68$3;
ps.executeBatch(); Sc% aJ1
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /z/hUa
|.y>[+Qb*
事务的处理 L& I`
#
1、关闭Connection的自动提交 b;Hm\aK
cn.setAutoCommit(false); :/>7$)+
2、执行一系列sql语句 >BJ2v=RA
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |)28=Z|Z
Statement sm ; }Vs~RJM)}
sm = cn.createStatement(insert into user...); \k|_&hG
sm.executeUpdate(); xR0~S
3caI
sm.close(); _2]e1_=
sm = cn.createStatement("insert into corp...); F<h&3
sm.executeUpdate(); $eK8GMxZ#
sm.close(); 6].yRNy"
3、提交 <+<)xwOQ ]
cn.commit(); lO551Y^
4、如果发生异常,那么回滚 dK:l&R
cn.rollback();