java 数据库基本操作 bZ0r/f,n$
1、java数据库操作基本流程 y\ouIsI77
2、几个常用的重要技巧: rJR"[TTJ
可滚动、更新的记录集 n#m )]YQC
批量更新 2p@S-Lp
事务处理 >YLwWU<X
:^px1
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 4Jht{#IIG
1、取得数据库连接 ]x~H"<V
1)用DriverManager取数据库连接 QHA<7Wg
例子 rU(N@i%
String className,url,uid,pwd; lQ@2s[
className = "oracle.jdbc.driver.OracleDriver"; c~p4M64
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; [ UQzCqV
uid = "system"; )=8X[<^i
pwd = "manager"; _4.fT
Class.forName(className); j#o0y5S
Connection cn = DriverManager.getConnection(url,uid,pwd); Y]ZOvA5W
2)用jndi(java的命名和目录服务)方式 t R*JM$T
例子 Z~$fTW6g
String jndi = "jdbc/db"; FJ~Dg3F1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); VNaa(Q
DataSource ds = (DataSource) ctx.lookup(jndi); -<qci3Ba}
Connection cn = ds.getConnection(); U
JY`P4(
多用于jsp中 $T~|@XH
2、执行sql语句 \O@,v0?R
1)用Statement来执行sql语句 :h?Zg(l
String sql; RaG-9gujI
Statement sm = cn.createStatement(); YW}1Mf=_
sm.executeQuery(sql); // 执行数据查询语句(select) z[V|W
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); lO)p
2)用PreparedStatement来执行sql语句 t[7YMk
String sql; <+C]^*j
sql = "insert into user (id,name) values (?,?)"; k4s >sd3 5
PreparedStatement ps = cn.prepareStatement(sql); NaLec|6<t
ps.setInt(1,xxx); o9>r
-
ps.setString(2,xxx); T*O!r`.Ak
... IL`5RZi1
ResultSet rs = ps.executeQuery(); // 查询 Xv6z>z.
int c = ps.executeUpdate(); // 更新 = R; 0Ed&b
&yWl8O
3、处理执行结果 X+Xjf(
查询语句,返回记录集ResultSet ll73}v
更新语句,返回数字,表示该更新影响的记录数 @yqy$I
ResultSet的方法 6Kg
lp\2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false N!aV~\E
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 F5:4 B]ZF
&QLCij5:
4、释放连接 hG; NJx-=R
cn.close(); F<
Qjoaz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection g,mcxXO
wbVM'E/&
可滚动、更新的记录集 61b,+'-
1、创建可滚动、更新的Statement MiAXbo#\
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); eRv3qK{`
该Statement取得的ResultSet就是可滚动的 |$^,e%bE
2、创建PreparedStatement时指定参数 1u'x|Un
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); l8n#sGA %
ResultSet.absolute(9000); ]g!k'@
批量更新 QV7K~qi
1、Statement }[$ C=|>
Statement sm = cn.createStatement(); 5c`DkWne%
sm.addBatch(sql1); % ;09J
sm.addBatch(sql2); 8kX3.X`
... %TvunV7NQS
sm.executeBatch() DSD#',
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 T&6{|IfM_
2、PreparedStatement :>;-uve8'
PreparedStatement ps = cn.preparedStatement(sql); WSKG8JT^|
{ ,r+=>vre
ps.setXXX(1,xxx); kjJ\7x6M
... 'BcxKqC
ps.addBatch(); ey@y?X=
} 2j*\n|"}{
ps.executeBatch(); XLI'f$w&
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 i%D/@$\D6
a|
事务的处理 {HlUV33O
1、关闭Connection的自动提交 &}wKC:LSP
cn.setAutoCommit(false); V! a|rTU6
2、执行一系列sql语句 `%"zq"1`0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close C.FGi`rrm
Statement sm ; )d_)CuUBe
sm = cn.createStatement(insert into user...); &>p2N
sm.executeUpdate(); +);o{wfW
sm.close(); "-90:"W
sm = cn.createStatement("insert into corp...);
YNH>^cD1
sm.executeUpdate(); 3@\vU~=P:
sm.close(); ?9
m3y0
3、提交 Y+F$]!hw
cn.commit(); ;M>0,
4、如果发生异常,那么回滚 C5*j0}
cn.rollback();