java 数据库基本操作 a2kAZCQ
1、java数据库操作基本流程 N
7Y X
2、几个常用的重要技巧: Y(2Z<d
可滚动、更新的记录集 <h}x7y?
批量更新 xU}J6 Tv
事务处理 /L@6Ae
+c,
^KHW
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 bD| "c
1、取得数据库连接 =6i+K.}e
1)用DriverManager取数据库连接 o^//|]H3Y
例子 F-
u"zox
String className,url,uid,pwd; -T-yt2h(
className = "oracle.jdbc.driver.OracleDriver"; Z glU{sU
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; n:b,zssP
uid = "system"; :i@
$s/
pwd = "manager"; $b2~H+u(
Class.forName(className); T!HAE#xC
Connection cn = DriverManager.getConnection(url,uid,pwd); :nc%:z=O
2)用jndi(java的命名和目录服务)方式 /=A@O !l
例子 rmtCCPF?0
String jndi = "jdbc/db"; [?;L
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); YnW9uy5
DataSource ds = (DataSource) ctx.lookup(jndi); mFxt +\
Connection cn = ds.getConnection(); H~SU:B:
多用于jsp中 D ]
n|d+
2、执行sql语句 U>m{B|H
1)用Statement来执行sql语句 ]=I2:Rb
String sql; ,dw\y/dn
Statement sm = cn.createStatement(); {;zHkmx
sm.executeQuery(sql); // 执行数据查询语句(select) o@]n<ZYo
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _x#y
2)用PreparedStatement来执行sql语句 bAuiMw7!
String sql; V[kn'QkWv
sql = "insert into user (id,name) values (?,?)"; 0uPcEpIA
PreparedStatement ps = cn.prepareStatement(sql); Y9vVi]4
ps.setInt(1,xxx); w(t1m]pF[
ps.setString(2,xxx); JO&RuAq
... DIWyv-
ResultSet rs = ps.executeQuery(); // 查询 ,j\uvi(Y
int c = ps.executeUpdate(); // 更新 s*Z
yr%R
O,
:|
3、处理执行结果 4mEJu
查询语句,返回记录集ResultSet Gm=&[?}
更新语句,返回数字,表示该更新影响的记录数 TcJJ"[0
ResultSet的方法 Qz%q#4Zb
1、next(),将游标往后移动一行,如果成功返回true;否则返回false burSb:JF
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 kM=&Tfpj
6Yt3Oq<U
4、释放连接 AN[pjC<
cn.close(); pS7y3(_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 61OlnmvE
Gl45HyY_
可滚动、更新的记录集 }1+2&Ps50
1、创建可滚动、更新的Statement 5J&Gc;[p
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _5O~]}
该Statement取得的ResultSet就是可滚动的 XFl&(I4tB
2、创建PreparedStatement时指定参数 :?m"kh
~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); C=U4z|Ym
ResultSet.absolute(9000); 9f5~hBlo
批量更新 SkVah:cF-
1、Statement DB_oRr[oj
Statement sm = cn.createStatement(); 4gdXO
sm.addBatch(sql1); ~|ZAS]
sm.addBatch(sql2); ,HmGp
... _%B,^0;C
sm.executeBatch() 3DB= Xh
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 )hoVB
2、PreparedStatement AeN:wOm
PreparedStatement ps = cn.preparedStatement(sql); {_$['D^ az
{ yfR0vp<&
ps.setXXX(1,xxx); hb/Z{T'
... XpK
Y#
ps.addBatch(); es.Y
} ) .' + {
ps.executeBatch(); *8yC6|wL?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 qD=b+\F
M
0RA&
事务的处理 B,Tv9(sv
1、关闭Connection的自动提交 ]~f-8!$$R
cn.setAutoCommit(false); TeR bW
2、执行一系列sql语句 MTgf.
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [z=!OFdE
Statement sm ; ZC<EPUV(
sm = cn.createStatement(insert into user...); Sz')1<
sm.executeUpdate(); p:{L fQ
sm.close(); @KLX,1K
sm = cn.createStatement("insert into corp...); ncOl}\Q9
sm.executeUpdate(); ;:J"- p
sm.close();
/7,@q?v
3、提交 `_ZbA#R,
cn.commit(); t
U~q4$qqE
4、如果发生异常,那么回滚 RF4B]Gqd
cn.rollback();