java 数据库基本操作 X/< zxM
1、java数据库操作基本流程 1!N|a< #
2、几个常用的重要技巧: 1Q[I $=-F
可滚动、更新的记录集 "cJ))v-'
批量更新 ;U+4!N
事务处理 QT\||0V~p
BQ8vg8e]B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 is?#wrV=K
1、取得数据库连接 FA5|`
1)用DriverManager取数据库连接 =|}_ASbzw
例子 R-2NJ0F7
String className,url,uid,pwd; <V[Qs3uo(
className = "oracle.jdbc.driver.OracleDriver"; 1Ce7\A
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Z5x&P_.x[
uid = "system"; RCZ"BxleU
pwd = "manager"; r{+P2MPW
Class.forName(className); hJ~Na\?w
Connection cn = DriverManager.getConnection(url,uid,pwd); &m{SWV+
2)用jndi(java的命名和目录服务)方式 tVI6GXH
例子 244[a]
%&;
String jndi = "jdbc/db"; 4gR;,%E\TO
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @k+&89@G
DataSource ds = (DataSource) ctx.lookup(jndi); +Tf4SJ
Connection cn = ds.getConnection(); %XF>k)
多用于jsp中 B/Jz$D
2、执行sql语句 G_ -8*.
1)用Statement来执行sql语句 0^lCZ,uq;
String sql; Mz59ac
Statement sm = cn.createStatement(); azK7kM~
sm.executeQuery(sql); // 执行数据查询语句(select) ?nf !sJ'm
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =6.4
2)用PreparedStatement来执行sql语句 /)+V(Jlu
String sql; T`ofj7$:
sql = "insert into user (id,name) values (?,?)"; G 6r2
"
PreparedStatement ps = cn.prepareStatement(sql); Jy^.L$bt
ps.setInt(1,xxx); .ei5+?V<i
ps.setString(2,xxx); <cof
... {l0[`"EF
ResultSet rs = ps.executeQuery(); // 查询 :P'M|U
int c = ps.executeUpdate(); // 更新 Z]~) ->=}
%XC3V7
3、处理执行结果 5>Kk>[|.
查询语句,返回记录集ResultSet }Quk n
更新语句,返回数字,表示该更新影响的记录数 &':Ecmo~`
ResultSet的方法 mJU1n
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 4Tdp;n\F
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Mg"e$m
,1K`w:uhS
4、释放连接 _O,k0O
cn.close(); <%Al(Lm0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection gJ=y7yX
W1;QPdz:
可滚动、更新的记录集 Xp67l!{v
1、创建可滚动、更新的Statement >TQNrS^$J
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); s~p(59
该Statement取得的ResultSet就是可滚动的 ;_~9".'<d
2、创建PreparedStatement时指定参数 >0X_UDAWz
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [r#m +R"N
ResultSet.absolute(9000); `=Z3X(Kc
批量更新 BjSd\Ul
1、Statement {D$5M/$
Statement sm = cn.createStatement(); /:Q
sm.addBatch(sql1); <jAn~=Uq[,
sm.addBatch(sql2); 4 (c{%%
... m[}@\y
sm.executeBatch() -F$v`|(O+
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 M\_IQj
2、PreparedStatement ieap
PreparedStatement ps = cn.preparedStatement(sql); VbI$#;:[7
{ |Cm6RH$(
ps.setXXX(1,xxx); o#K*-jOfiH
... \[9^,QP
ps.addBatch(); # 4&t09
} 14pyHMOR
ps.executeBatch(); vojXo|c
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 e"(SlR
(Q?@LzCjy
事务的处理 y*#YIS56I
1、关闭Connection的自动提交 7 1+
bn
cn.setAutoCommit(false); |!q,J
2、执行一系列sql语句 elGwS\sw
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -=WQed}
Statement sm ; s-801JpiJ
sm = cn.createStatement(insert into user...); ^wIg|Gc
sm.executeUpdate(); Y@y"bjK \
sm.close(); /(u# D[
sm = cn.createStatement("insert into corp...); k>)Uyw$!
sm.executeUpdate(); J kxsua
sm.close(); .<zN/&MXf
3、提交 z -c1,GOD
cn.commit(); C=Tq/L w
4、如果发生异常,那么回滚 ?={S"qK(q
cn.rollback();