java 数据库基本操作 }4Gn$'e
1、java数据库操作基本流程 ,
d4i0;2}+
2、几个常用的重要技巧: ;:)u
rI?
可滚动、更新的记录集 6H|T )
批量更新 \/y&l\ k)
事务处理 %+
MYg^
|ew:}e: k<
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 % <%r
1、取得数据库连接 ,fm{
krE
1)用DriverManager取数据库连接 TjctK [db@
例子 KZ [:o,jp>
String className,url,uid,pwd; >4T7DMy
className = "oracle.jdbc.driver.OracleDriver"; MF::At[4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <S@2%%W
uid = "system"; ;/^O7KM-
pwd = "manager"; j8t_-sU9 i
Class.forName(className); !6s]p%{V
Connection cn = DriverManager.getConnection(url,uid,pwd); !<>`G0
2)用jndi(java的命名和目录服务)方式 qMBEJ<o
例子 \5)
ZI'q
String jndi = "jdbc/db"; xz/G$7q7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 5pE@Ww
DataSource ds = (DataSource) ctx.lookup(jndi); Nn5sD3z#
Connection cn = ds.getConnection(); Oo%%f+
多用于jsp中 @d[)i,d:G
2、执行sql语句 XToYtdt2
1)用Statement来执行sql语句 <,nd]a
String sql; ^DR`!.ttr
Statement sm = cn.createStatement(); D4+OWbf6
sm.executeQuery(sql); // 执行数据查询语句(select) [rhK2fr:i
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -]MZP:s
2)用PreparedStatement来执行sql语句 O<0-`=W,a
String sql; 8O^z{Yh7
sql = "insert into user (id,name) values (?,?)"; 7q^a@5f BG
PreparedStatement ps = cn.prepareStatement(sql); xSjs+Y;Mu
ps.setInt(1,xxx); sQY0Xys<4
ps.setString(2,xxx); Bq\WG=Fd
... /9C>{29x!
ResultSet rs = ps.executeQuery(); // 查询 LS1}j WU!
int c = ps.executeUpdate(); // 更新 gHU0Pr9'
qI\B;&hr(
3、处理执行结果 b=Q%Jxz?
查询语句,返回记录集ResultSet YccD^w[`B
更新语句,返回数字,表示该更新影响的记录数 T:udw
ResultSet的方法 N8]d0
1、next(),将游标往后移动一行,如果成功返回true;否则返回false SjU0Xb)[
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 u O~MT7~[X
Uw>g^[V;
4、释放连接 oVnHbvP1X
cn.close(); d[KG0E5`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [i N}W5
m
_5768G`P
可滚动、更新的记录集 `"E<%$|ZQy
1、创建可滚动、更新的Statement xTdh/}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ZCkwK
该Statement取得的ResultSet就是可滚动的 !iGZo2LV
2、创建PreparedStatement时指定参数 8~h.i1L
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?u M2|Nk
ResultSet.absolute(9000); mv9@Az9
批量更新 q VJC O-K|
1、Statement [Q20c<,
Statement sm = cn.createStatement(); 2ISnWzq;
sm.addBatch(sql1); locf6%2g~
sm.addBatch(sql2); e%&/K7I "?
... qznd'^[
sm.executeBatch() ?$X1X`@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6imQjtI
2、PreparedStatement rIF6^?
PreparedStatement ps = cn.preparedStatement(sql); *ps")?tlC
{ 6rzXM`cs
ps.setXXX(1,xxx); 9m_Hm')VG
... c
]&|.~2 &
ps.addBatch(); c5tCw3$t
} B976{;QvXV
ps.executeBatch(); sBu- \P#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 A!!W\Jt
p\/;^c`7
事务的处理 h{M.+I$}C
1、关闭Connection的自动提交 e?!A]2
cn.setAutoCommit(false); "zBYhZr
2、执行一系列sql语句 FDO$(&
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close D7b]
;Nf\
Statement sm ; Ja#ti y
sm = cn.createStatement(insert into user...); :+\B|*T2.L
sm.executeUpdate(); VSa#X |z
sm.close(); b\9}zmG[u
sm = cn.createStatement("insert into corp...); q%GlS=o"
sm.executeUpdate(); o%=OBTh_
sm.close(); TW?A/GoXI
3、提交 cYp]zn+6
cn.commit(); YXhxzH hPd
4、如果发生异常,那么回滚 keWqL]
cn.rollback();