java 数据库基本操作 Bp7`W:?#"
1、java数据库操作基本流程 k6}M7&nY
2、几个常用的重要技巧: ]RvFn~E!s
可滚动、更新的记录集 x}tg/`.=z
批量更新 s-Z<
事务处理 ^?~WIS
(\I9eBm
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Fhk 8
1、取得数据库连接 <73dXTZ0
1)用DriverManager取数据库连接 -5 Q
gJ
例子 1Mtm?3Pt
String className,url,uid,pwd; C3]"y7
className = "oracle.jdbc.driver.OracleDriver"; FYLBaN
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; t/k MV6
uid = "system"; }g9g]\.!a
pwd = "manager"; #H5i$ o
Class.forName(className); `xq/<U;i
Connection cn = DriverManager.getConnection(url,uid,pwd); Bn<1zg5
2)用jndi(java的命名和目录服务)方式 n9w(Z=D\
例子 .,9e~6}
String jndi = "jdbc/db"; %*A|hK+G:W
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #$^vP/"$
DataSource ds = (DataSource) ctx.lookup(jndi); TOx >Z
Connection cn = ds.getConnection(); X1C
&;5
多用于jsp中 y!kU0
2、执行sql语句 [gybdI5wur
1)用Statement来执行sql语句 E5+-N
String sql; _X6@.sM/2
Statement sm = cn.createStatement(); MV?#g-5
sm.executeQuery(sql); // 执行数据查询语句(select) _-R&A@
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); GL^84[f-T
2)用PreparedStatement来执行sql语句 N+9W2n
String sql; /)-OK7x
sql = "insert into user (id,name) values (?,?)"; 7/969h^s
PreparedStatement ps = cn.prepareStatement(sql); wxc24y
ps.setInt(1,xxx); @4]} J-3
ps.setString(2,xxx); )L0NX^jW;
... sq45fRAi
ResultSet rs = ps.executeQuery(); // 查询 zAkF:^#Y
int c = ps.executeUpdate(); // 更新 ?lPyapA]
_Oc(K
"v
3、处理执行结果 @km@\w
查询语句,返回记录集ResultSet 7@NV|Idtd
更新语句,返回数字,表示该更新影响的记录数 |\<L7|hb9
ResultSet的方法 %Ek!3t
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Gpf9uj%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }Sr=|j
Tv6HPD$[
4、释放连接 oB$c-!&
cn.close(); ]pq(Q:"P,5
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @QO^3%b8
r T"3^,,
可滚动、更新的记录集 EGysA{o"X
1、创建可滚动、更新的Statement L6 IIk
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); WS6;ad;|
该Statement取得的ResultSet就是可滚动的 \#sdN#e;XA
2、创建PreparedStatement时指定参数 0$B X8?Z
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); PSHzB!
H=n
ResultSet.absolute(9000); ?ocBRla
批量更新 +:kMYL3
1、Statement qO RL
7?{
Statement sm = cn.createStatement(); t\XA
JU
sm.addBatch(sql1); fl}!V4
sm.addBatch(sql2); :Xs3Vh,V
... U62Z ?nge%
sm.executeBatch() `>Ms7G9S~e
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Sfa;;7W@R
2、PreparedStatement u10;qYfL8o
PreparedStatement ps = cn.preparedStatement(sql); Tvl"KVGm
{ >+9:31p
ps.setXXX(1,xxx); U8a5rF><
... Ke^9R-jP
ps.addBatch(); lFN|)(X
} \OwCZ!`7i
ps.executeBatch(); 8/<+p? 3p>
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m(w 9s;<
AD~_n^
事务的处理 3Dx@rW\
1、关闭Connection的自动提交 &fW'_,-
cn.setAutoCommit(false); Z]XjN@j"
2、执行一系列sql语句 NpH9},1i
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [0!*<%BgK'
Statement sm ; jbe_r<{
sm = cn.createStatement(insert into user...); sD$K<nyz
sm.executeUpdate(); *z^Au7,&
sm.close();
s&iu+>
sm = cn.createStatement("insert into corp...); kkIG{Bw
sm.executeUpdate(); x~ID[
sm.close(); AquO#A[,#
3、提交 f\?1oMO\
cn.commit(); =\M6s
4、如果发生异常,那么回滚 n?QglN
cn.rollback();