java 数据库基本操作 C[pAa 8
1、java数据库操作基本流程 -_2=NA?t
2、几个常用的重要技巧: RuHJk\T+
可滚动、更新的记录集 a-Y K*
批量更新 p<![JeV
事务处理 wRuJein#
YsTfv1~z#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 zX5p'8-
1、取得数据库连接 d8x$NW-s
1)用DriverManager取数据库连接 sQ`8L+oY
例子 / '7WL[<
String className,url,uid,pwd; Ek4aC3
className = "oracle.jdbc.driver.OracleDriver"; ?d_Cy\G
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; wPW9 bu
uid = "system"; a.gu
pwd = "manager"; ;[6u79;I
Class.forName(className); Bg#NB
Connection cn = DriverManager.getConnection(url,uid,pwd); GI~;2 `V
2)用jndi(java的命名和目录服务)方式 7f`jl/
例子 O|OPdD
String jndi = "jdbc/db"; P= ]ZXj[
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); E-Mp|y /V
DataSource ds = (DataSource) ctx.lookup(jndi); *|4~
0w
Connection cn = ds.getConnection(); mG2}JWA
多用于jsp中 +)V6"XY-(
2、执行sql语句 -m__I U
1)用Statement来执行sql语句 }XAoMp
String sql; ^ i\zMMR
Statement sm = cn.createStatement(); FUHjY
sm.executeQuery(sql); // 执行数据查询语句(select) 5[ @4($q8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); yP"_j&ef7
2)用PreparedStatement来执行sql语句 hZ%Ie%~n
String sql; ;/YSQt)rc>
sql = "insert into user (id,name) values (?,?)"; f[%iRfUFw
PreparedStatement ps = cn.prepareStatement(sql); Ya>cGaLq
ps.setInt(1,xxx); 2 1;n0E
ps.setString(2,xxx); xXyzzr1[
... jm*v0kNy
ResultSet rs = ps.executeQuery(); // 查询 a
@TAUJ,
int c = ps.executeUpdate(); // 更新 (57x5qP
X
`HHbQXB
3、处理执行结果 G&;W
查询语句,返回记录集ResultSet eR3!P8t
更新语句,返回数字,表示该更新影响的记录数 ~=c#Ff=Z
ResultSet的方法 1&m08dZm5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false iPs()IN.O
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *rqih_j0
Maq{H`
4、释放连接 4[5Z>2w
cn.close(); !>! l=Z
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Y[pGaiN:
#ocT4
可滚动、更新的记录集 pM4 j=F
1、创建可滚动、更新的Statement 2/h Mx-
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); "cti(0F-d
该Statement取得的ResultSet就是可滚动的 LxG :?=O.
2、创建PreparedStatement时指定参数 zS?L3*u
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); m@yaF:
R
ResultSet.absolute(9000); K J~f ~2;
批量更新 8Y4YE(x5
1、Statement Bg34YmZ
Statement sm = cn.createStatement(); 1ra}^H}
sm.addBatch(sql1); HM<V$
R
sm.addBatch(sql2); ukZL
... yyZjMnuD
sm.executeBatch() WLizgVM
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4S9AXE6
2、PreparedStatement `
a@NYi6
PreparedStatement ps = cn.preparedStatement(sql); w%L0mH2]ng
{ m>a6,#I
ps.setXXX(1,xxx); < ' T6k\
... 2sf/^XC1
ps.addBatch(); )}/9*
} $<T)_g
ps.executeBatch(); ) .#,1
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 (I\aGGW
:yO)g]KF
事务的处理 H,?AaM[V
1、关闭Connection的自动提交 2o{Fp7l
cn.setAutoCommit(false); IoA"e@~t
2、执行一系列sql语句 ofN|%g /
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ##FN0|e&
Statement sm ; &;,w})
sm = cn.createStatement(insert into user...); E|Z Y2&J`4
sm.executeUpdate(); <iL+/^#
sm.close(); m-;u]X=a
sm = cn.createStatement("insert into corp...); B-Fu/n
sm.executeUpdate(); n /rQ*hr
sm.close(); mWO=(}Fb\
3、提交 bk"` hq
cn.commit(); -BB 5bsjA
4、如果发生异常,那么回滚 g*8sh
cn.rollback();