java 数据库基本操作 )n8(U%q$
1、java数据库操作基本流程
5X2&hG*
2、几个常用的重要技巧: TFrZ+CcWp2
可滚动、更新的记录集 MfzSoxCb
批量更新 3LT[?C]H$
事务处理
Tk(ciwB
,{{e'S9cy
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :u}FF"j
1、取得数据库连接 \F_~?$
1)用DriverManager取数据库连接 -oSfp23u
例子 mJjd2a"vi
String className,url,uid,pwd; &p/^A[
className = "oracle.jdbc.driver.OracleDriver"; lFHj]%Y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; {rp5qgVE<
uid = "system"; :el]IH
pwd = "manager";
{*EA5;
Class.forName(className); #
tN#_<W
Connection cn = DriverManager.getConnection(url,uid,pwd); Q>`|{m
2)用jndi(java的命名和目录服务)方式 8t{-
例子 +Usy
String jndi = "jdbc/db"; nJEm&"AI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Qfx:}zk{
DataSource ds = (DataSource) ctx.lookup(jndi); >Q159qZ
Connection cn = ds.getConnection(); ~N2<-~=si
多用于jsp中 _0Mt*]L }
2、执行sql语句 ^SdorPOq&
1)用Statement来执行sql语句 ==$>M
d
String sql; Yh=/?&*
Statement sm = cn.createStatement(); tvh)N{j
sm.executeQuery(sql); // 执行数据查询语句(select) {5<3./5O
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); s,KE,$5F
2)用PreparedStatement来执行sql语句 /uXEh61$8
String sql; Kwc~\k
sql = "insert into user (id,name) values (?,?)"; Tyc`U&
PreparedStatement ps = cn.prepareStatement(sql); V\C$/8v
ps.setInt(1,xxx); Y!M&8;>
ps.setString(2,xxx); e!+_U C
... HzdtR
ResultSet rs = ps.executeQuery(); // 查询 #;l~Y}7'
int c = ps.executeUpdate(); // 更新 9d4Agj
M
/eZ UAxq
3、处理执行结果 N~<H`
查询语句,返回记录集ResultSet q-3,p.
更新语句,返回数字,表示该更新影响的记录数 Yv}V =O%
ResultSet的方法 pf_(?\oz>
1、next(),将游标往后移动一行,如果成功返回true;否则返回false LV$@J
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zkFx2(Hq-f
2m$\]\kCUv
4、释放连接 RgF5w<Vd.
cn.close(); xPuuG{Sm
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection W{z7h[?5,
!F@9xG
可滚动、更新的记录集 5e> <i
1、创建可滚动、更新的Statement I-=H;6w7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); c:%ll&Xtn
该Statement取得的ResultSet就是可滚动的 }p2YRTH x
2、创建PreparedStatement时指定参数 P, (#'
W
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); P5vxQR_*lc
ResultSet.absolute(9000); @j|B1:O
批量更新 j?5s/
1、Statement C(t>ZR
Statement sm = cn.createStatement(); !N, Oe<
sm.addBatch(sql1); hB]\vA7
sm.addBatch(sql2); znNJ?
... zjuU*$A4
sm.executeBatch() Tc{n]TV
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Sdk:-Zuv
2、PreparedStatement 3&'u7e
PreparedStatement ps = cn.preparedStatement(sql); !R{C
{ @'
V=Vr
ps.setXXX(1,xxx); 5]c'n
... q4'Vb
ps.addBatch(); GIo7-
6kvm
} h x_,>\@
ps.executeBatch(); p5 !B
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 4P1<Zi+<
WyO7,Qr\
事务的处理 a{oG[e
1、关闭Connection的自动提交 38I .1p9
cn.setAutoCommit(false); @U~i<kt
2、执行一系列sql语句 Wr3).m52}P
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close y;M}I8W[
Statement sm ; G-54D_ 4
sm = cn.createStatement(insert into user...); f{m,?[1C,
sm.executeUpdate(); Kbdjd p
sm.close(); ?9F_E+!
sm = cn.createStatement("insert into corp...); \(S69@f
sm.executeUpdate(); g$z9 ( i+
sm.close(); W.B;Dy,Y
3、提交 |H.i$8_A
cn.commit();
2s+ITPr
4、如果发生异常,那么回滚 |oYqkP|
cn.rollback();