java 数据库基本操作 a%c <3'
1、java数据库操作基本流程 nZi&`HjQ
2、几个常用的重要技巧: aR3jeB,=x
可滚动、更新的记录集 MuWZf2C
批量更新 cz IEkm
事务处理 <6-73LsHcP
Z]uc *Ed
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {,5.svO
1、取得数据库连接 :"#
"{P
1)用DriverManager取数据库连接 -Wa<}Tz
例子 CP\[9#]:
String className,url,uid,pwd; YZfi-35@g
className = "oracle.jdbc.driver.OracleDriver"; 0B8Wf/j?M
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; BTwc(oL
uid = "system"; ngZq]8=o
pwd = "manager"; KgM|:'
Class.forName(className); <k8WnA ~Fl
Connection cn = DriverManager.getConnection(url,uid,pwd); T+T)~!{%
2)用jndi(java的命名和目录服务)方式 F1BvDplQ>G
例子 wowf1j-
String jndi = "jdbc/db"; Vq0X:<9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); F_:Wu,dUZ
DataSource ds = (DataSource) ctx.lookup(jndi); cr -5t4<jK
Connection cn = ds.getConnection(); KJJ:fG8'
多用于jsp中 j_,/U^Ws|f
2、执行sql语句 E8av/O
VUd
1)用Statement来执行sql语句 lfb+ )s
String sql; !EKt$8W
Statement sm = cn.createStatement(); B~}BDnu 6
sm.executeQuery(sql); // 执行数据查询语句(select) e+!xy&u@u
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); `#iL'ND[
2)用PreparedStatement来执行sql语句 +mBS&FK
String sql; `EgX#
sql = "insert into user (id,name) values (?,?)"; H2|'JA#v
PreparedStatement ps = cn.prepareStatement(sql); (&79}IEd
ps.setInt(1,xxx); .*6NqX$
ps.setString(2,xxx); 'eBD/w5U
... )6%*=-
ResultSet rs = ps.executeQuery(); // 查询 e=h-}XRC
int c = ps.executeUpdate(); // 更新 5D<Zbn.>q
-cU bIbW
3、处理执行结果 *2/qm:gB
查询语句,返回记录集ResultSet HdlOGa6C
更新语句,返回数字,表示该更新影响的记录数 G0h&0e{w
ResultSet的方法 KsIHJr7-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,k_ b-/
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 <=_!8A
BYdGK@ouk
4、释放连接 8aHE=x/TL
cn.close(); ~Qif-|[V
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection qPz_PRje
qGN>a[D
可滚动、更新的记录集 bx2<WdLyT
1、创建可滚动、更新的Statement bn|HvLQ"1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ncadVheKt
该Statement取得的ResultSet就是可滚动的 Ndl{f=sjX-
2、创建PreparedStatement时指定参数 !L;_f'\)6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); vG6*[c8
ResultSet.absolute(9000); lFf>z}eLy
批量更新 A-B>VX
1、Statement Ln6emXqw
Statement sm = cn.createStatement(); "
]k}V2l
sm.addBatch(sql1); *6<4ECa7C
sm.addBatch(sql2);
).GM0-y
...
TR*vZzoy
sm.executeBatch() lE%KzX?&
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H/`@6, j
2、PreparedStatement A-m IWTa
PreparedStatement ps = cn.preparedStatement(sql); 3%r/w7Fc
{ PUD8
ps.setXXX(1,xxx); ~pH!.|k-&
... !/H `
ps.addBatch(); =?4[:#Rh
} ]O:u9If
ps.executeBatch(); U.Vn|s(`z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 xX<T5Ls
|1H9,:*%
事务的处理 AXxyB"7A}
1、关闭Connection的自动提交 O0r vr$.
cn.setAutoCommit(false); &b,A-1`w_
2、执行一系列sql语句 QsPg4y3?D
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close \s)$[pAF
Statement sm ; X!6dg.n5
sm = cn.createStatement(insert into user...); s\~j,$Mm2
sm.executeUpdate(); qYVeFSS
sm.close(); 2s,cyCw&
sm = cn.createStatement("insert into corp...); I+W,%)vb
sm.executeUpdate(); ;2`t0#J$]
sm.close(); I m-M2n
3、提交 8cvSA&l(D
cn.commit(); };}N1[D
4、如果发生异常,那么回滚 R-W.$-rF
cn.rollback();