java 数据库基本操作 Wdy2;a<\{
1、java数据库操作基本流程 kV<VhBql!
2、几个常用的重要技巧: ,sLV6DM
可滚动、更新的记录集 D]oS R7h
批量更新 b|fq63ar;
事务处理 =
)(;
TD3R/NP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <<;j=Yy({`
1、取得数据库连接 PiH#9XB
1)用DriverManager取数据库连接 QL\'pW5
例子 n!tC z<v
String className,url,uid,pwd; [;.zl1S<
className = "oracle.jdbc.driver.OracleDriver"; .)W8
U [
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; msoE8YK&tg
uid = "system"; e dD(s5
pwd = "manager"; vk#xCggK
Class.forName(className); +pjD{S~Y
Connection cn = DriverManager.getConnection(url,uid,pwd); TUk1h\.q
2)用jndi(java的命名和目录服务)方式 %HSoQ?qA
例子 aX
?ON
String jndi = "jdbc/db";
Y@.:U*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); zR`]8E]
DataSource ds = (DataSource) ctx.lookup(jndi); v1)jZ.:
Connection cn = ds.getConnection(); beIEy(rA
多用于jsp中 1[}VyP6 e
2、执行sql语句 ="I]D
I
1)用Statement来执行sql语句 !A<?nz
Uv
String sql; 4QDF%#~q^
Statement sm = cn.createStatement(); o\2#}eie
sm.executeQuery(sql); // 执行数据查询语句(select) M=!x0V ;
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); n
~
=]/
2)用PreparedStatement来执行sql语句 isDr|g$S
String sql; ^,`yt^^A
sql = "insert into user (id,name) values (?,?)"; U1&m-K
PreparedStatement ps = cn.prepareStatement(sql); Z~P5SEg
ps.setInt(1,xxx); 02=eE|Y@
ps.setString(2,xxx); duwZe+
... gWJLWL2
ResultSet rs = ps.executeQuery(); // 查询 4ci
@$nL1
int c = ps.executeUpdate(); // 更新 ,D#~%kq~
@s@r5uR9B
3、处理执行结果 7,
O_'T &
查询语句,返回记录集ResultSet KWd]?e)
更新语句,返回数字,表示该更新影响的记录数 ?N`W,
ResultSet的方法 G2e m>W_n
1、next(),将游标往后移动一行,如果成功返回true;否则返回false WMYvE\"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 -lLq)
s3t{freM
4、释放连接 rVZkG,Q
cn.close(); okfhd{9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9v/1>rziE
`XI1,&Wp7
可滚动、更新的记录集 `+i<:,z-gs
1、创建可滚动、更新的Statement ,@GI3bl
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )2:d8J\
该Statement取得的ResultSet就是可滚动的
1vQ*Br
2、创建PreparedStatement时指定参数 Knn$<!>
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); E?%rmdyhL!
ResultSet.absolute(9000); V<(cW'zA/
批量更新 0 5 `x$f
1、Statement x.}iSE{
Statement sm = cn.createStatement(); z+Y0Zh";/#
sm.addBatch(sql1); <sn^>5Ds
sm.addBatch(sql2); y/
vE
... *y u|]T
sm.executeBatch() hfVJg7-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 HjL+Wg
2、PreparedStatement .hn"NXy
PreparedStatement ps = cn.preparedStatement(sql); [9*+s
{ @_0XK)pW
ps.setXXX(1,xxx); (i&:=Bfn)
... Lw2EA 5
ps.addBatch(); dTS7l02
} l8jm7@.E
ps.executeBatch(); JrS|Ib)6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 4fQ<A <2/
`Y8F}%i[
事务的处理 q,kdr)-
1、关闭Connection的自动提交 /2WGo-
cn.setAutoCommit(false); ,uK
}$l
2、执行一系列sql语句 $M#G;W5c
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close N9idk}T
Statement sm ; 1@;Dn'
sm = cn.createStatement(insert into user...); Pe~[qETv
sm.executeUpdate(); Np+<)q2
sm.close(); S0du,A~
sm = cn.createStatement("insert into corp...); -=@d2LY
sm.executeUpdate(); +<&_1%5+
sm.close(); f{G
^b&x
3、提交 0.=dOz r
cn.commit(); 7S}NV7
4、如果发生异常,那么回滚 Xq@Bzya
cn.rollback();