java 数据库基本操作 l\l]9Z6%
1、java数据库操作基本流程 SvpTs
2、几个常用的重要技巧: F#C 6.`B
可滚动、更新的记录集 U JRT4>G
批量更新 _ .
事务处理 `0gK;D8t
WOTu"Yj
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Env}g CX
1、取得数据库连接 a9q?9X
1)用DriverManager取数据库连接
C(Gb
例子 O5n]4)<
String className,url,uid,pwd; BE@H~<E J
className = "oracle.jdbc.driver.OracleDriver"; RBojT
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; vBQ?S2f
uid = "system"; yDBgSO{d
pwd = "manager"; {_gj>n (1
Class.forName(className); T{J`t*Ym
Connection cn = DriverManager.getConnection(url,uid,pwd); vWU4ZBT8G
2)用jndi(java的命名和目录服务)方式 Tqh Rs
例子 uN^qfJ'@
>
String jndi = "jdbc/db"; *[/Xhx"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?ut juMdl
DataSource ds = (DataSource) ctx.lookup(jndi); .&!{8jBX
Connection cn = ds.getConnection(); 38S&7>0@|q
多用于jsp中 Am^O{`r41
2、执行sql语句 ;;J98G|1
1)用Statement来执行sql语句 YY>Uf1}*9
String sql; BGYm]b\j[
Statement sm = cn.createStatement(); K`83C`w.
sm.executeQuery(sql); // 执行数据查询语句(select) P\4o4MF@K
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); TVh7h`Eg
2)用PreparedStatement来执行sql语句 :s985sEv
String sql; [
:(M<u`y>
sql = "insert into user (id,name) values (?,?)"; F[giq1#
PreparedStatement ps = cn.prepareStatement(sql); D`@U[ `Sw
ps.setInt(1,xxx); g<5Pc,
ps.setString(2,xxx); [ESs?v$
... ?'_7#0R_0
ResultSet rs = ps.executeQuery(); // 查询 o8pe07n(W
int c = ps.executeUpdate(); // 更新 iSW73P;)
|*| a~t
3、处理执行结果 ':>*=&
查询语句,返回记录集ResultSet J]YN2{(x
更新语句,返回数字,表示该更新影响的记录数 PSw+E';
ResultSet的方法 OmuZ0@.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false vF\zZ<R/
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Qy,qQA/
M|]1}8d?
4、释放连接 8$olP:d
cn.close(); H/I`c>Zn
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection s3%8W==rBW
@*{BX~f
可滚动、更新的记录集 Hjkgy%N
1、创建可滚动、更新的Statement u1Yp5jp^K
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); IYC#H}
该Statement取得的ResultSet就是可滚动的 6df&B
.gg
2、创建PreparedStatement时指定参数 f__WnW5h
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); r1?FH2Ns
ResultSet.absolute(9000); Qz$Dv@*y\
批量更新 FDC{8e
1、Statement -k{R<L
Statement sm = cn.createStatement(); *F&&rsb
sm.addBatch(sql1); b:&$x (|
sm.addBatch(sql2); }&hgedx
... !\uk b
sm.executeBatch() !/Ps}.)A`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
aj B
2、PreparedStatement 9\0 K%LL
PreparedStatement ps = cn.preparedStatement(sql); ;z=C]kI6M
{ \Y 4Z Q"0Q
ps.setXXX(1,xxx); X'4
Yofs
... ]V("^.~$+C
ps.addBatch(); RN|..zml
} VMXXBa&
ps.executeBatch(); 8{<cqYCR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 1uQf}
H)+kN'J
事务的处理 m%\[1|N
1、关闭Connection的自动提交 JH;DVPX9z
cn.setAutoCommit(false); <\mc|p"
2、执行一系列sql语句 _Q}z 6+_\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |O2PcYNu
Statement sm ; }d]8fHG
sm = cn.createStatement(insert into user...); M.Ik%nN#K0
sm.executeUpdate(); ;^i,Q} b/
sm.close(); RV(z>XM
sm = cn.createStatement("insert into corp...); m~B=C>r}t
sm.executeUpdate(); DNe^_v)]|
sm.close(); Ee&$9 )t
3、提交 OwaXG/z~
cn.commit(); %%[TM(z
4、如果发生异常,那么回滚 o$k$
cn.rollback();