java 数据库基本操作 QGnBNsA h
1、java数据库操作基本流程 aE(j_`L78
2、几个常用的重要技巧: 9n"D/NZB
可滚动、更新的记录集 k:0HsN!F9
批量更新 \{[Gdj`
事务处理 <M|kOi
;u0MY
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 AA$-Lx(UJk
1、取得数据库连接 dRXF5Ox5K}
1)用DriverManager取数据库连接 1x#Z}XG
例子 hqVFb.6[
String className,url,uid,pwd; H`;q@
className = "oracle.jdbc.driver.OracleDriver"; Fh4kd>1D
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; a$SGFA}V
uid = "system"; 14p <0BG
pwd = "manager"; fWywegh
Class.forName(className); 0x\bDWZ_
Connection cn = DriverManager.getConnection(url,uid,pwd); gUB%6v G\I
2)用jndi(java的命名和目录服务)方式 -&*
4~
例子 OXuBtW*,z+
String jndi = "jdbc/db"; q8{)27f,
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); C-abc+/
DataSource ds = (DataSource) ctx.lookup(jndi);
K$dSg1t
Connection cn = ds.getConnection(); c_li.]P
多用于jsp中 ^F `
2、执行sql语句 x2\,n
1)用Statement来执行sql语句 ~I%m[fQ S
String sql; ['~B&
Statement sm = cn.createStatement(); #,1Kum
bG3
sm.executeQuery(sql); // 执行数据查询语句(select) I|*w?i*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); emo@&6*
2)用PreparedStatement来执行sql语句 }0Qex=vkO
String sql; Wi
Mi0?$.
sql = "insert into user (id,name) values (?,?)"; p#UrZKR
PreparedStatement ps = cn.prepareStatement(sql); W0&NX`m
ps.setInt(1,xxx); 8(euWS
ps.setString(2,xxx); c|%.B2
... s=&&gC1
ResultSet rs = ps.executeQuery(); // 查询 Pvq74?an`
int c = ps.executeUpdate(); // 更新 =Vv"\p8
6.| {l8%r
3、处理执行结果 ]4m;NI d
查询语句,返回记录集ResultSet =G%k|
更新语句,返回数字,表示该更新影响的记录数 tk@
T-;
ResultSet的方法 0wCJNXm
1、next(),将游标往后移动一行,如果成功返回true;否则返回false -rSpgk0wL
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 r(W=1e'
qcSlY&6+
4、释放连接 I5l5fx
cn.close(); )DS|mM)
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection r
wtU@xsD
\YE(E04w57
可滚动、更新的记录集 `;yfSoY
1、创建可滚动、更新的Statement ;N4A9/)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Wp"+\{@)
该Statement取得的ResultSet就是可滚动的 Z6eM~$Y
2、创建PreparedStatement时指定参数 N,9W18
@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); r%*,pN7O
ResultSet.absolute(9000); x w8
e
批量更新 owDp?Sy}E
1、Statement bhqBFiuhH
Statement sm = cn.createStatement(); |kPjjVGF{
sm.addBatch(sql1); 7{%_6b"
sm.addBatch(sql2); \a+.~_iL|
... eM";P/XaX
sm.executeBatch() B8){
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 }&+b\RE
2、PreparedStatement uOzol~TU)
PreparedStatement ps = cn.preparedStatement(sql); \&K{v#g~
{ B|9)4f&\=R
ps.setXXX(1,xxx); KTr7z^
... ?/Bp8q(
ps.addBatch(); )N4!zuSVf
} K(
: NshM
ps.executeBatch(); LO8`qq*rq
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 s9R#rwIc
J!40`8i
事务的处理 9K]Li\
1、关闭Connection的自动提交 *E*=
;BG
cn.setAutoCommit(false); 'aYUF&GG
2、执行一系列sql语句 V\$'3(*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close k1l\Rywp
Statement sm ; 3K2B7loD)~
sm = cn.createStatement(insert into user...); M3m!u[6|
sm.executeUpdate(); v?Z30?_&h
sm.close(); F xek#
sm = cn.createStatement("insert into corp...); |$*1!pL-QP
sm.executeUpdate(); ^U"$uJz!c
sm.close(); (X=JT
3、提交 5f;6BP
cn.commit(); z l?Gd4
4、如果发生异常,那么回滚 hk6(y?#
cn.rollback();