java 数据库基本操作 :'y
1、java数据库操作基本流程 N)Qj^bD!
2、几个常用的重要技巧: ,b>cy&ut
可滚动、更新的记录集 y NV$IN%
批量更新 ?Z4&j'z<
事务处理 };9dd3X
%W"\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 PkDL\Nqe
1、取得数据库连接 x|0Q\<mEe
1)用DriverManager取数据库连接 Y@eHp-[
例子 H[@}ri<
String className,url,uid,pwd; R'dF<&Kj|
className = "oracle.jdbc.driver.OracleDriver"; 3JW9G04.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; fH`1dU
uid = "system"; C*Ws6s>+z
pwd = "manager"; BT>*xZLpS
Class.forName(className); Aog3d\1$
Connection cn = DriverManager.getConnection(url,uid,pwd); 0nx
<f>n
2)用jndi(java的命名和目录服务)方式 C,2IET
例子 h83ho
String jndi = "jdbc/db"; D\({]oj]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); q,nj|9z V
DataSource ds = (DataSource) ctx.lookup(jndi); gEKJrAA
Connection cn = ds.getConnection(); }/c.>U
多用于jsp中 P05_\
t
2、执行sql语句 sbK0OA
1)用Statement来执行sql语句 ccD+o$7LT
String sql; Xz]}cRQ[
Statement sm = cn.createStatement(); aS~k.^N
sm.executeQuery(sql); // 执行数据查询语句(select) %J.Rm0FD:
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5mSXf"R^
2)用PreparedStatement来执行sql语句 wT*N{).
String sql; tHoFnPd\|
sql = "insert into user (id,name) values (?,?)"; 3 tXtt@Yy
PreparedStatement ps = cn.prepareStatement(sql); 9}}D -&Mc
ps.setInt(1,xxx); )Xd=EWGUS
ps.setString(2,xxx); GsDSJz
... QQ2xNNF[
ResultSet rs = ps.executeQuery(); // 查询 ^|\ *i
int c = ps.executeUpdate(); // 更新 KD,b.s
YY7:WQS
3、处理执行结果 !&Q,]\j
查询语句,返回记录集ResultSet 2gt08\
更新语句,返回数字,表示该更新影响的记录数 U^pe/11)H
ResultSet的方法 1MB
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Fi5,y;]R
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Ce 5
}+A}
gFDP:I/`
4、释放连接 u85y;AE,(
cn.close(); A1Q]KS@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2#+@bk>^{
xmiF!R
可滚动、更新的记录集 uU5:,Wy+dg
1、创建可滚动、更新的Statement &<_sXHg<x
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); iZjvO`@[
该Statement取得的ResultSet就是可滚动的 ][G<CO`k
2、创建PreparedStatement时指定参数 _"WQi}Mm
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); `n^jU92
ResultSet.absolute(9000); qk_
s"}sS
批量更新 bO2$0!=I
1、Statement k9^P#l@p
Statement sm = cn.createStatement(); [j93Mp
sm.addBatch(sql1); 0A 4(RLGg
sm.addBatch(sql2); U +mx@C_
... ' J-(v
sm.executeBatch() _|A)ueY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $ ~D`-+J
2、PreparedStatement :~T:&;q0
PreparedStatement ps = cn.preparedStatement(sql); uL-i>!"L!}
{ $wN'mY
ps.setXXX(1,xxx); :eIBK
... !5A
nr
ps.addBatch(); W{-N,?z
} f2{4Y)
ps.executeBatch(); }WCz*v1Wq
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2o\\qEYg
up:e0di{
事务的处理 o.Cj+`0} 5
1、关闭Connection的自动提交 -q+Fj;El
cn.setAutoCommit(false); 0A1l"$_|
2、执行一系列sql语句 kN}.[enI~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close l>=c]
Statement sm ; @F,HyCSN
sm = cn.createStatement(insert into user...); :=i0$k<E/
sm.executeUpdate(); /au\OBUge
sm.close(); cOUO_xp(
sm = cn.createStatement("insert into corp...); ~(%G;fZ?x
sm.executeUpdate(); pM#:OlqC
sm.close(); m7RWu I,
3、提交 iz*aBXV A[
cn.commit(); |Cen5s
W&
4、如果发生异常,那么回滚 H<NYm#a"
cn.rollback();