java 数据库基本操作 YM1@B`yWE
1、java数据库操作基本流程 J
tYnBg?[E
2、几个常用的重要技巧: #@y4/JS&2
可滚动、更新的记录集 ^P&y9dC.
批量更新 p(U'c}@2
事务处理 nBGk %NM 8
)W*S6}A
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8#7z5:_
1、取得数据库连接 !\?? [1_e
1)用DriverManager取数据库连接 v9M;W+J
例子 "hs`Y4U
String className,url,uid,pwd; /A<L
className = "oracle.jdbc.driver.OracleDriver"; 2,NQ(c_c$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; EVRg/{X
uid = "system"; kCN9`9XI{
pwd = "manager"; \!G&:<h
Class.forName(className); @Cw<wrem
Connection cn = DriverManager.getConnection(url,uid,pwd); q\mVZyj
2)用jndi(java的命名和目录服务)方式 6\b B#a
例子 8b|&
String jndi = "jdbc/db"; l4r09"S|V
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uv9cOd
DataSource ds = (DataSource) ctx.lookup(jndi); .D)'ZY
Connection cn = ds.getConnection(); X<Vko^vlj
多用于jsp中 Qy@chN{eP
2、执行sql语句 ]_F%{ 8|
1)用Statement来执行sql语句 wCn W]<+
String sql; ~p8-#A)X,)
Statement sm = cn.createStatement(); +XFF@h&=t
sm.executeQuery(sql); // 执行数据查询语句(select) &IOChQ`8P
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z4E:Z}~''
2)用PreparedStatement来执行sql语句 7CM<"pV
String sql; Q> @0'y=s
sql = "insert into user (id,name) values (?,?)"; ivw2EEo,
PreparedStatement ps = cn.prepareStatement(sql); }@a_x,O/x}
ps.setInt(1,xxx); #.FtPR
ps.setString(2,xxx); v0=^Hym
... R:i7Rb2C
ResultSet rs = ps.executeQuery(); // 查询 )ZNH/9e/
int c = ps.executeUpdate(); // 更新 _~5{l_v|I
1(rH5z'F
3、处理执行结果 B{c,/{ =O
查询语句,返回记录集ResultSet 3{]i| 1&j
更新语句,返回数字,表示该更新影响的记录数 oD~VK,.
ResultSet的方法 >,32~C
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 3Yg/-=U(
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9:YiLoz?
d
t0?4 d
4、释放连接 p~+)!Z#
cn.close(); Tfs7SC8ta
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection pS*vwYA
HPr5mWs:
可滚动、更新的记录集 $S=lm {
1、创建可滚动、更新的Statement [T~O%ly7x&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 2x3&o|J
该Statement取得的ResultSet就是可滚动的 <\2,7K{{+;
2、创建PreparedStatement时指定参数 j"J2&Y2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); M<g>z6
ResultSet.absolute(9000); 0gfa7+Y
批量更新 >9Ub=tZm
1、Statement EiIbp4*e
Statement sm = cn.createStatement(); Xm\tyLY
sm.addBatch(sql1); &``;1/J*W
sm.addBatch(sql2); . (Q;EF`_U
... *vUKh^="
sm.executeBatch() 0(:"q!h
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 />K$_T/]
2、PreparedStatement f }eZX
PreparedStatement ps = cn.preparedStatement(sql); Lgvmk
{
BNuzlR
ps.setXXX(1,xxx); Z"% =
... s 6vsV
ps.addBatch(); &xrm;pO
} "fr B5[
ps.executeBatch(); 9(ANhG
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _%z)Y=Q
MP;7u%
事务的处理 Dr,{V6^
1、关闭Connection的自动提交 rc9 \
cn.setAutoCommit(false); 8Z F Ps/HP
2、执行一系列sql语句 /Q})%j1S0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $*L@ym
Statement sm ; J3y5R1?EP
sm = cn.createStatement(insert into user...); d!e$BiC
sm.executeUpdate(); yxLGseD
sm.close(); KzI$GU3
sm = cn.createStatement("insert into corp...); )bw^!w)
sm.executeUpdate(); U#d",s
sm.close(); t<~riFs]
3、提交 7cY_=X-?Y
cn.commit(); tezsoR!.ak
4、如果发生异常,那么回滚 )5Gzk&|
cn.rollback();