java 数据库基本操作 -
[j0B|cwG
1、java数据库操作基本流程 -. {7;6:(k
2、几个常用的重要技巧: DR8dJ#
可滚动、更新的记录集 <:-&yDh u
批量更新 SoIMf tX
事务处理 SUhP
e+
,Z"sh*
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 /VkJ+%}+j
1、取得数据库连接 s:P-F0q!&
1)用DriverManager取数据库连接 6V/mR~F1r
例子 6dMpd4"\
String className,url,uid,pwd; WLH2B1_):
className = "oracle.jdbc.driver.OracleDriver"; R8*4E0\br
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; e~dU "
uid = "system"; 0g4cyK~n]
pwd = "manager"; W>Kn*Dy8~
Class.forName(className); '9XwUQx
Connection cn = DriverManager.getConnection(url,uid,pwd); 4HAfTQ 1G
2)用jndi(java的命名和目录服务)方式 4+:u2&I
例子 r$zXb9a|<
String jndi = "jdbc/db"; E;0"1
P|S
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); rtz(Jt{<
DataSource ds = (DataSource) ctx.lookup(jndi); F$C:4c
Connection cn = ds.getConnection(); u}_q'=<\
多用于jsp中 ]dFWIvC
2、执行sql语句 8nM]G4H.f
1)用Statement来执行sql语句 Jo]g{GX[
String sql; u5[Wr :
Statement sm = cn.createStatement(); UqbE
sm.executeQuery(sql); // 执行数据查询语句(select) 0"Hf6xz
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); lom4z\6
2)用PreparedStatement来执行sql语句 akoI LX~u
String sql; d"a`?+(Q
sql = "insert into user (id,name) values (?,?)"; .&xc2sRZ
PreparedStatement ps = cn.prepareStatement(sql); j!pxG5%
ps.setInt(1,xxx); 5/<Y,eZ/
ps.setString(2,xxx); ga1RMRu+
... EIAT*l :NW
ResultSet rs = ps.executeQuery(); // 查询 HAXx`r<
int c = ps.executeUpdate(); // 更新 [gDvAtTZ5
/hHD\+0({
3、处理执行结果 O.!?O(
查询语句,返回记录集ResultSet RIlPH~
更新语句,返回数字,表示该更新影响的记录数 xi0&"?7la
ResultSet的方法 z`CIgSR
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zi'?FM[f)
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 xhv)rhu@
~mU#u\r(*
4、释放连接 =n!8>8d
cn.close(); klKt^h-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection m6}"g[nN
NH/H+7,o
可滚动、更新的记录集 XUWza=BR"
1、创建可滚动、更新的Statement @EvnV.
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); h fNBWN
该Statement取得的ResultSet就是可滚动的 -.y3:^){^
2、创建PreparedStatement时指定参数 IiL?@pIq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <JlKtR&nSo
ResultSet.absolute(9000); fO+;%B
批量更新 va)\uXW.N
1、Statement -z@}:N-uR
Statement sm = cn.createStatement(); Cv3H%g+as
sm.addBatch(sql1); SU^/qF%8
sm.addBatch(sql2); 4Y'qoM;
... @:
NrC76
sm.executeBatch() aOOY_S
E
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
aG!!z>
2、PreparedStatement ^?,/_ 3
PreparedStatement ps = cn.preparedStatement(sql); k58lmuU
{ MLJ8m
ps.setXXX(1,xxx); KW)yTE<
... cuHs`{u@P
ps.addBatch(); y}|zH
} +VfJ:[q
ps.executeBatch(); 7~
2X/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 %PQC9{hUy$
N4r`czoj
事务的处理 lVtgg?
1、关闭Connection的自动提交 6YN4]
cn.setAutoCommit(false); Sx}h$E:
2、执行一系列sql语句 `8Gwf;P1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close LY"/ Q
Statement sm ; =i.[|g"
sm = cn.createStatement(insert into user...); (jXgJ" m
sm.executeUpdate(); '#XP:nqFkK
sm.close(); &*0V!+#6
sm = cn.createStatement("insert into corp...); WWY9U
sm.executeUpdate(); F4@h}T5)
sm.close(); phTZUmi
3、提交 G[jCmkK
cn.commit(); nBQG.3
4、如果发生异常,那么回滚 b'G4KNW
cn.rollback();