java 数据库基本操作 WG1UvPK
1、java数据库操作基本流程 )DI/y1
2、几个常用的重要技巧: s@jzu
可滚动、更新的记录集 Fwm{oypg%
批量更新 k8GcHqNHx
事务处理 `Ft.Rwj2:m
rPv+eM">
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 #hH "g
1、取得数据库连接 D""d-oI[
1)用DriverManager取数据库连接 U*(m'Ea
例子 u f.Zg;Vc
String className,url,uid,pwd; %$~?DDNM
className = "oracle.jdbc.driver.OracleDriver"; 1YTnOiYS1
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ]O,!B''8k
uid = "system"; y4/>3tz;
pwd = "manager"; 15)=>=1mR.
Class.forName(className); c_yf=
Connection cn = DriverManager.getConnection(url,uid,pwd); :05>~bn>pC
2)用jndi(java的命名和目录服务)方式 k10dkBoEX
例子 pV=X
String jndi = "jdbc/db"; :eo2t>zF-<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Om\?<aul
DataSource ds = (DataSource) ctx.lookup(jndi); H/|Mq#K
Connection cn = ds.getConnection(); ${8 1~
多用于jsp中 k =ru)
_$2
2、执行sql语句 z%}^9
1)用Statement来执行sql语句 (fUXJ$
String sql; cZe,l1$
Statement sm = cn.createStatement(); S"!nM]2L
sm.executeQuery(sql); // 执行数据查询语句(select) #W @6@Mv
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); w3:Y]F.ot
2)用PreparedStatement来执行sql语句 _WVeb}
String sql; Ja4O*C<
sql = "insert into user (id,name) values (?,?)"; LrX7WI
PreparedStatement ps = cn.prepareStatement(sql); ;4z6="<Y
ps.setInt(1,xxx); &\F`M|c
ps.setString(2,xxx); g|9'Lk
... R.Ao%VT
ResultSet rs = ps.executeQuery(); // 查询 8*V3g_z
int c = ps.executeUpdate(); // 更新 :5L9tNr{_
NJ/6_e
3、处理执行结果 R Q X
查询语句,返回记录集ResultSet nBgksB*A
更新语句,返回数字,表示该更新影响的记录数 ?}D@{%O3T
ResultSet的方法 5sao+dZ"|
1、next(),将游标往后移动一行,如果成功返回true;否则返回false m;>HUTj
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 N32!*TsWs
?i>.<IPOq
4、释放连接 )|~pocXt<
cn.close(); ~]*P/'-{#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection j,K]TJ
u%Bk"noCa
可滚动、更新的记录集 *T$`5|
1、创建可滚动、更新的Statement +?),BRCce
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); DBWe>Ef(
该Statement取得的ResultSet就是可滚动的 m*6C *M
2、创建PreparedStatement时指定参数 + t({:>E
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ko]A}v\]
ResultSet.absolute(9000); f\nF2rlu
批量更新 |bk.gh
1、Statement ^8,HJG,!
Statement sm = cn.createStatement(); "~:o#~F6
sm.addBatch(sql1);
U!r2`2LY
sm.addBatch(sql2); <S:SIaf0
... 'JsP9>)
sm.executeBatch() zF[kb%o
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Psij*%I4
2、PreparedStatement h\Ck""&
PreparedStatement ps = cn.preparedStatement(sql); ?lKFcm
{ U;<07
aMj
ps.setXXX(1,xxx); 3WZ]9v{k
... EJ;:O1,6H
ps.addBatch(); 5`53lK.C
} X-|Lg.s
ps.executeBatch(); <Td4 o&JR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 h$)+$^YI
K9\`Wu_qL
事务的处理 3R1v0
1、关闭Connection的自动提交 2%y}El^+_
cn.setAutoCommit(false); EtjN :p|$
2、执行一系列sql语句 _Qs=v0B//
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^31X-}tv
Statement sm ; Q&}`( ]k
sm = cn.createStatement(insert into user...); v@_b"w_TY
sm.executeUpdate(); p&/}0eL y
sm.close(); Zg"g/I.+d
sm = cn.createStatement("insert into corp...); 7%)
F]
sm.executeUpdate(); ~4S@kYe{3K
sm.close(); v_3r8My-
3、提交 GD<xmuo
cn.commit(); &k*sxW'
4、如果发生异常,那么回滚 wWB-P6
cn.rollback();