java 数据库基本操作 5fuOl-M0W
1、java数据库操作基本流程 P3C|DO4
2、几个常用的重要技巧: Rf2$k/lZ
可滚动、更新的记录集 V~M>K-AL
批量更新 {^ 1s
事务处理 JnE\E(ez
6[>UF!.=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 zk= 3L} C
1、取得数据库连接 T<kyxbjR
1)用DriverManager取数据库连接 JTB_-J-TU
例子 )]~'zOE_
String className,url,uid,pwd; ! 4 `any
className = "oracle.jdbc.driver.OracleDriver"; nf?;h!_7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Cp(,+dD
uid = "system"; >:%YAR`
pwd = "manager"; o\u31,
Class.forName(className); 1"ko wp
Connection cn = DriverManager.getConnection(url,uid,pwd); &niROM,;K
2)用jndi(java的命名和目录服务)方式 1c_qNI;:p
例子 Ub(zwR;
String jndi = "jdbc/db"; +ew 2+2
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); S*~v9+
DataSource ds = (DataSource) ctx.lookup(jndi); G
m40u/
Connection cn = ds.getConnection(); ]^:l?F\h
多用于jsp中 uCuXY#R+
2、执行sql语句 8t3@Hi
1)用Statement来执行sql语句 1V(tt{
String sql; ;=.VKW%U
Statement sm = cn.createStatement(); 9NLO{kN
sm.executeQuery(sql); // 执行数据查询语句(select) {FyGh
*/
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); nsk`nck
2)用PreparedStatement来执行sql语句 |9.`qv
String sql; 0p\R@{
sql = "insert into user (id,name) values (?,?)"; fXCx!3m
PreparedStatement ps = cn.prepareStatement(sql); ^,[V;3
ps.setInt(1,xxx); 6N[XWyS
ps.setString(2,xxx); U WYLT-^x
... u|h>z|4lJj
ResultSet rs = ps.executeQuery(); // 查询 Q| >
\{M
int c = ps.executeUpdate(); // 更新 Wo=Q7~
=+ `I%>wc
3、处理执行结果 {<%zcNKl^L
查询语句,返回记录集ResultSet 4KF
1vw
更新语句,返回数字,表示该更新影响的记录数 1HK5OT&
ResultSet的方法 ~_=ohb{
1、next(),将游标往后移动一行,如果成功返回true;否则返回false O{hGh{y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "P;_-i9O
KIO{6
4、释放连接 ,p6X3zY
cn.close(); [X[d`@rXv
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
L>Bf}^
r2H_)Oi
可滚动、更新的记录集 qg?O+-+
1、创建可滚动、更新的Statement Fn0Rq9 /@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /Y|oDfv
该Statement取得的ResultSet就是可滚动的 tkU"/$Vi\
2、创建PreparedStatement时指定参数 vy\;#X!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -ZqN~5>j)
ResultSet.absolute(9000); 3l"7 $B
批量更新 A8Q1x/d(
1、Statement J2H/z5YRJ4
Statement sm = cn.createStatement(); DPR=Xls
sm.addBatch(sql1); aW$(lf2;
sm.addBatch(sql2); 3#vhQ*xU
... v
WKUV|
sm.executeBatch() _uU}J5d.
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ]5b%r;_
2、PreparedStatement @4dB$QF`&
PreparedStatement ps = cn.preparedStatement(sql); ~9#[\/;"
{ 6+HpN"?e
ps.setXXX(1,xxx); l(|@ dp
... l?E7'OEF:
ps.addBatch(); 5]n5nqz
} 8;>vgD
ps.executeBatch(); /=co/}i
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !7XAc,y
G\3@QgyQ
事务的处理 sLh9=Kh`
1、关闭Connection的自动提交 En%PIkxeR
cn.setAutoCommit(false); `ro~l_U;A
2、执行一系列sql语句 b}63?.M{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +BcJHNIB
Statement sm ; c0M=T
sm = cn.createStatement(insert into user...); 3]Rb2$p[=
sm.executeUpdate(); L ;5uB2
sm.close(); d7Lna^
sm = cn.createStatement("insert into corp...); F.ml]k&(m
sm.executeUpdate(); n]G!@-z
sm.close(); =w='qjh
3、提交 L/,#:J
cn.commit(); bp Q/#\Z
4、如果发生异常,那么回滚 V~p/P
cn.rollback();