java 数据库基本操作 z( !K8
T
1、java数据库操作基本流程 ,gO(zI-1
2、几个常用的重要技巧: `8 Ann~Z|k
可滚动、更新的记录集 PAD&sTjE*
批量更新 \+Nn>wW.
事务处理 -3GlpC22
q2+`a;_S
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 f|+aa6hN
1、取得数据库连接
E!EENg
1)用DriverManager取数据库连接 S7v# `#
例子 QnJd}(yN
String className,url,uid,pwd; #fVk;]u`[3
className = "oracle.jdbc.driver.OracleDriver"; Hb&C;lk
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %\f<N1~*
uid = "system"; `RlMfd
pwd = "manager";
@f!r"P]
Class.forName(className); ]mR!-Fqj
Connection cn = DriverManager.getConnection(url,uid,pwd); mI>=S
2)用jndi(java的命名和目录服务)方式 t) uS7y
例子 /1BqC3]tL
String jndi = "jdbc/db"; jR[b7s
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Ir6(EIwx0
DataSource ds = (DataSource) ctx.lookup(jndi); jvQpfd
Connection cn = ds.getConnection(); mufXM(
多用于jsp中 u>\u}c
2、执行sql语句 bHRRgR`,
1)用Statement来执行sql语句 Xmny(j)g
String sql; xLShMv}
Statement sm = cn.createStatement(); +\x}1bNS%j
sm.executeQuery(sql); // 执行数据查询语句(select) X..<U}e
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {>Yna"p
2)用PreparedStatement来执行sql语句 DCP
B9:u
String sql; Lk lD^AJA
sql = "insert into user (id,name) values (?,?)"; 'H8b+
PreparedStatement ps = cn.prepareStatement(sql); >F5E^DY
ps.setInt(1,xxx); AfT;IG%Gt
ps.setString(2,xxx); ) :VF^"
... Y52TC@'
ResultSet rs = ps.executeQuery(); // 查询 {
Ba_.]x
int c = ps.executeUpdate(); // 更新 ZH)thd9^b
Ba}<X;B }
3、处理执行结果 gP2<L5&Z,
查询语句,返回记录集ResultSet d3;Sy`.
更新语句,返回数字,表示该更新影响的记录数 -|2k$W
ResultSet的方法 6f*QUw~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false F\2<q$Zn+
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 06]%$-j
exxH0^
4、释放连接 F-=Xbyr3@
cn.close(); Ake$M^Bz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection miUjpXt
uskJ(!
可滚动、更新的记录集 g3| 62uDF
1、创建可滚动、更新的Statement LV8{c!"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); X:JU#sI
该Statement取得的ResultSet就是可滚动的 @[v4[yq-
2、创建PreparedStatement时指定参数 *J3Z.fq%:i
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 'FM_5`&
ResultSet.absolute(9000); 2l}H=DZV
批量更新 Oj1B @QE
1、Statement 9j>LU<Z
Statement sm = cn.createStatement(); /_mU%fl
sm.addBatch(sql1); Z8I0v$LjR
sm.addBatch(sql2); =rN_8&
... 9Pql\]9"o
sm.executeBatch() 3H`r|R
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 gxc8O).5vY
2、PreparedStatement "ph[)/u;
PreparedStatement ps = cn.preparedStatement(sql); )v+\1
{ rqTsKrLe
ps.setXXX(1,xxx); IFbN ]N0
... x31Jl{x8\?
ps.addBatch(); .23Yqr'zT
} ?wVq5^ e
ps.executeBatch(); gaU(ebsE
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 iE#I^`^V
;m~%57.;\
事务的处理 %9OVw#P
1、关闭Connection的自动提交 Ay|K>8z
cn.setAutoCommit(false); ]$)U~)T
iW
2、执行一系列sql语句 KkZS 6rD\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close dmYgv^t
Statement sm ; -5y=K40
sm = cn.createStatement(insert into user...); 5}4>vEn
sm.executeUpdate(); 85rjM#~
sm.close(); oAF#bj_f
sm = cn.createStatement("insert into corp...); 3vj1FbY
sm.executeUpdate(); _F`RwBOjs
sm.close(); X\1.,]O >
3、提交 8X#\T/U
cn.commit(); \# _w=gs<i
4、如果发生异常,那么回滚 AvcN,
cn.rollback();