java 数据库基本操作 'op_GW
1、java数据库操作基本流程 ^62I 5k/u
2、几个常用的重要技巧: /^bU8E&^M
可滚动、更新的记录集 n[# **s
批量更新 7VWy1
事务处理 V?p`rrj@
|`{$Ego:
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 i
XGy*#>V
1、取得数据库连接 OPogH=vf
1)用DriverManager取数据库连接 >l=^3B,j
例子 IY
mkZ?cW
String className,url,uid,pwd; HS\'{4P
className = "oracle.jdbc.driver.OracleDriver"; bw+IH-b
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "pH;0[r]
uid = "system"; ?1] \3nj
pwd = "manager"; U}5]Vm$]
Class.forName(className); D0TFC3.k}
Connection cn = DriverManager.getConnection(url,uid,pwd); dxtG3
2)用jndi(java的命名和目录服务)方式 _sy]k A
例子 up0=Y
o@
String jndi = "jdbc/db"; >g@@ yR,
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8s-X H
DataSource ds = (DataSource) ctx.lookup(jndi); ~,xso0
Connection cn = ds.getConnection(); @U1t~f^
多用于jsp中 P97i<pB Y_
2、执行sql语句 gkKNOus
1)用Statement来执行sql语句 BW`;QF<
String sql; U)Tl<l<
Statement sm = cn.createStatement(); vz1I/IdTd
sm.executeQuery(sql); // 执行数据查询语句(select) #TH(:I=[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,Tk53 "
2)用PreparedStatement来执行sql语句 JeA_mtSQ|
String sql; K]|hkp&
sql = "insert into user (id,name) values (?,?)"; mQ:YHtHE.F
PreparedStatement ps = cn.prepareStatement(sql); a$bE2'cb
ps.setInt(1,xxx); ,]das
ps.setString(2,xxx); _Vt(Eg_\
... I9`ZK2S
ResultSet rs = ps.executeQuery(); // 查询 \g)?7>M |
int c = ps.executeUpdate(); // 更新 t%f>*}*P*
sb?!U"v.'
3、处理执行结果 ,Z! I ^
查询语句,返回记录集ResultSet C',uY7}<
更新语句,返回数字,表示该更新影响的记录数 pr,1pqiAf
ResultSet的方法 AI9922}*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false TgJ6O,0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 \$F#bIjC
HMmVfGp]
4、释放连接 ap"pQ[t;
cn.close(); EVA&By6_k
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u),.q7(m
5l%g3F
可滚动、更新的记录集 }Gx@1)??
1、创建可滚动、更新的Statement W{j(=<|<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); K*4ib/'E a
该Statement取得的ResultSet就是可滚动的 ]&P 4QT)f
2、创建PreparedStatement时指定参数 *Ue#Sade
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2:e7'}\D.
ResultSet.absolute(9000); CteNJBm
批量更新 U9awN&1([
1、Statement :QXKG8^
Statement sm = cn.createStatement(); 7+hc?H[&'
sm.addBatch(sql1); ua_,c\iL
sm.addBatch(sql2); W%o! m,zFM
... A0v@L6m-O
sm.executeBatch() 2d
YU
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 E]^n\bE%
2、PreparedStatement LZE9]Gd
PreparedStatement ps = cn.preparedStatement(sql); jJ,y+o
{ U:[CcN/~3
ps.setXXX(1,xxx); 9JJ6$cLF
... s%6L94\t
ps.addBatch(); C^,J6;'
} }ov>b2H#<
ps.executeBatch(); y6MkaHW[m
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 B+pLW/4l
Wvl'O'R
事务的处理 $*Wa A`(U
1、关闭Connection的自动提交 &h=f
cn.setAutoCommit(false); fGe"1MfU
2、执行一系列sql语句 W2M[w_~QE
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %dhrXK5
Statement sm ; 1'dZ?`O
sm = cn.createStatement(insert into user...); ;sz _W%-;@
sm.executeUpdate(); Xr88I^F;
sm.close(); :&2%x
sm = cn.createStatement("insert into corp...); 1Oak8 \G
sm.executeUpdate(); -SzCeq(p%5
sm.close(); L6ypn)l
3、提交 cFuQ>xR1
cn.commit(); ?MFXZ/3(ba
4、如果发生异常,那么回滚 Q7/Jyx|
cn.rollback();