java 数据库基本操作 <8>gb!D G
1、java数据库操作基本流程 Bg*Oj)NM
2、几个常用的重要技巧: }^;Tt-*k
可滚动、更新的记录集 %+U.zd$
批量更新 H\7Qf8s|{
事务处理 %B$~yx3#
A7|!&fi
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 wvum7K{tI
1、取得数据库连接 )Ab!R:4
1)用DriverManager取数据库连接 F{a- -
例子 y8uB>z+#+;
String className,url,uid,pwd; pzP~,cdf
className = "oracle.jdbc.driver.OracleDriver"; iXt >!f*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; gf^"sfNk
uid = "system"; NZSP*# !B
pwd = "manager"; lz?F ,].
Class.forName(className); 4
e1=b,
Connection cn = DriverManager.getConnection(url,uid,pwd); v_PhJKE
2)用jndi(java的命名和目录服务)方式 8o-*s+EY"&
例子 {1.t ZCMT
String jndi = "jdbc/db"; z!quA7s<]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :[oFe/1K!4
DataSource ds = (DataSource) ctx.lookup(jndi); s88lN=;
Connection cn = ds.getConnection(); x8xSA*@k
多用于jsp中 ML!Zm[I9
2、执行sql语句 AXhV#nZt0
1)用Statement来执行sql语句
g-MaP
String sql; hmv"|1Sa!~
Statement sm = cn.createStatement(); Iq`:h&'!L
sm.executeQuery(sql); // 执行数据查询语句(select) Y#EM]x5!=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); y,i:BQJ<
2)用PreparedStatement来执行sql语句 }u0t i"V
String sql; Bkvh]k;F8
sql = "insert into user (id,name) values (?,?)"; }UK<tUO
PreparedStatement ps = cn.prepareStatement(sql); &y/
ps.setInt(1,xxx); lV/-jkR
ps.setString(2,xxx); GU\}}j]
... #y }{ 'rF?
ResultSet rs = ps.executeQuery(); // 查询 FOxMt;|M
int c = ps.executeUpdate(); // 更新 sHx>UvN6
pJ7M.C!
3、处理执行结果 {#aW")x^#
查询语句,返回记录集ResultSet y| *X
更新语句,返回数字,表示该更新影响的记录数 S+G!o]&2
ResultSet的方法 w~A{]s{4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false dHV3d'.P
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &R:$h*Wt|
48JD >=@7
4、释放连接 #IjG[a-
cn.close(); KiU/N$E
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection fX=o,=-f
ZtPq*/'
可滚动、更新的记录集 Gj[`r
1、创建可滚动、更新的Statement D3s]49j)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); N6Mo|
该Statement取得的ResultSet就是可滚动的 :uE:mY%R
2、创建PreparedStatement时指定参数 #'N"<o[
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); RHc63b\
ResultSet.absolute(9000); w,fA-*bZ 0
批量更新 [;3` Aw
1、Statement jdsN ZV
Statement sm = cn.createStatement(); AV\6K;~
sm.addBatch(sql1); ^sR]w]cz.
sm.addBatch(sql2); 8.4 1EKr2
... J0@<6~V6o
sm.executeBatch() d?G~k[C!a
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #?/&H;n_8S
2、PreparedStatement Y;ytm
#=
PreparedStatement ps = cn.preparedStatement(sql); fG2hCP+
{ B2\R#&X.
ps.setXXX(1,xxx); a[;TUc^I1F
... bkfwsYZx
ps.addBatch(); =~M%zdIXv
}
<WN?
ps.executeBatch(); eYd6~T[9
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 i`-,=RJ
rxZ%vzVQ>
事务的处理 w8$rt
1、关闭Connection的自动提交 R4+Gmx1
cn.setAutoCommit(false); G9y
0;br
2、执行一系列sql语句 v0762w
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $I40 hk
Statement sm ; ]PQ] f*Ik>
sm = cn.createStatement(insert into user...); 'r;C(Gh6
sm.executeUpdate(); 0'T*l2Z`2
sm.close(); gFR9!=,/V%
sm = cn.createStatement("insert into corp...); AnK-\4
sm.executeUpdate(); 5g9lO]WDI
sm.close(); W`HO Q
3、提交 oG5:]/F
cn.commit(); C{mL]ds<
4、如果发生异常,那么回滚 tHlKo0S$0
cn.rollback();