java 数据库基本操作 bUy!hS;s
1、java数据库操作基本流程 0H%zkJ>Q
2、几个常用的重要技巧: gkTwGI+w
可滚动、更新的记录集 -;6uN\gq
批量更新 |;aZi?Ek[
事务处理 =B+dhZ+#S$
Z= -fL
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 p|qLr9\A
1、取得数据库连接 UWqiA`,
1)用DriverManager取数据库连接 7)O+s/.P)
例子 p]~PyzG!
String className,url,uid,pwd; Hsov0
className = "oracle.jdbc.driver.OracleDriver"; (6H7?nv
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =],c$)
uid = "system"; Z
s|*+[
pwd = "manager"; (I;81h`1G
Class.forName(className); QCDica `+*
Connection cn = DriverManager.getConnection(url,uid,pwd); *
#z@b
2)用jndi(java的命名和目录服务)方式 <
fe.
例子 T^+K`U
String jndi = "jdbc/db"; >e.vUUQ{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); yXtQfR
DataSource ds = (DataSource) ctx.lookup(jndi); 6
3PV R"
Connection cn = ds.getConnection(); ;InMgo,
多用于jsp中 &'DR`e O)
2、执行sql语句 D8B\F5..c#
1)用Statement来执行sql语句 ]RadwH"0!
String sql; .*595SuF
Statement sm = cn.createStatement(); \%}]wf}
sm.executeQuery(sql); // 执行数据查询语句(select) 1W0[|Hf2v*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;*nzb!u\\
2)用PreparedStatement来执行sql语句 DH$Nz
String sql; K'Wv$[~Dc
sql = "insert into user (id,name) values (?,?)"; ;sUvY* Bcm
PreparedStatement ps = cn.prepareStatement(sql); cw0@Z0
ps.setInt(1,xxx); tqB6:p-%
ps.setString(2,xxx); /IX555/dR1
... (?7}\B\
ResultSet rs = ps.executeQuery(); // 查询 -y_q
int c = ps.executeUpdate(); // 更新 6r%i=z
3*7 klu
3、处理执行结果 e8_EB/)_Z
查询语句,返回记录集ResultSet M
$EHx[*5
更新语句,返回数字,表示该更新影响的记录数 HpeU'0u0VK
ResultSet的方法 E)p[^1WC
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^xgPL'
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
BlT)hG(M>
&01KHJY)/G
4、释放连接
(<Cg|*s
cn.close(); 7FaF]G
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection })PU`?f
lFA-T I&
可滚动、更新的记录集 M0vX9;J
1、创建可滚动、更新的Statement jgEYlZ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8/P!i2o
该Statement取得的ResultSet就是可滚动的 /UR;,ts
2、创建PreparedStatement时指定参数 >*^SQ{9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Z;R/!Py.
ResultSet.absolute(9000); 0Nk!.gY
批量更新 OYa9f[ $
1、Statement |{%$x^KyJ
Statement sm = cn.createStatement(); *cXi*7|=
sm.addBatch(sql1); 6I_4{
sm.addBatch(sql2); Y2ON!Rno
... Y>2#9LA
sm.executeBatch() \SgBI/L^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 BP&]t1p
2、PreparedStatement \7o7~pll
PreparedStatement ps = cn.preparedStatement(sql); >G [:Q
s
{ %\'G2
ps.setXXX(1,xxx);
l]
... X*Q<REDB
ps.addBatch(); u
Vv%k5
} G_k_qP^:
ps.executeBatch(); *|6vCR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 hVZS6gU,x
I~ mu'T
事务的处理 nI73E
1、关闭Connection的自动提交 r4?|sAK
cn.setAutoCommit(false); pma=*
2、执行一系列sql语句 R$eEW"]
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 7coVl$_Zl
Statement sm ; zqXDD; w3
sm = cn.createStatement(insert into user...); yS?5&oMl
sm.executeUpdate(); =
~*Vfx
sm.close(); u<Ch]m+
sm = cn.createStatement("insert into corp...); &I{5f-o*
sm.executeUpdate(); 6 pQo_l}
sm.close(); t="nmjQs
3、提交 OSJj^Y)W|
cn.commit(); AOqL&z
4、如果发生异常,那么回滚 fCO<-L9k$
cn.rollback();