java 数据库基本操作 Q l)hIf$Oo
1、java数据库操作基本流程 E|f[#+:+
2、几个常用的重要技巧: Ha-]U:Vcx
可滚动、更新的记录集 U[f00m5{HV
批量更新 ?$109wZ:9
事务处理 N5=BjXSAg
rnj$u-8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u3+B/ 5x
1、取得数据库连接 tj@(0}pi4
1)用DriverManager取数据库连接 R*D<M3
例子 }l7+W4~
String className,url,uid,pwd; rl%,9JD!
className = "oracle.jdbc.driver.OracleDriver"; &R<aRE:+R
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @!f4>iUy
uid = "system"; NgGMsE\C}
pwd = "manager"; O[ird`/
Class.forName(className); - /\qGI
Connection cn = DriverManager.getConnection(url,uid,pwd); +,>%Yb=EA
2)用jndi(java的命名和目录服务)方式 F,p0OL.
例子 @h{|tP%"
String jndi = "jdbc/db"; W[O]Aal{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ^-~JkW'z
DataSource ds = (DataSource) ctx.lookup(jndi); ?x #K:a?
Connection cn = ds.getConnection(); zW%Em81Wd
多用于jsp中 %DKFF4k
2、执行sql语句 JyMk @Y
1)用Statement来执行sql语句 M/Yr0"%Q<.
String sql; [UzD3VPg
Statement sm = cn.createStatement(); ~#*C,4m
sm.executeQuery(sql); // 执行数据查询语句(select) *pJGp:{6V?
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Yao}Xo9}
2)用PreparedStatement来执行sql语句 f?sm~PwC-
String sql; R}Lk$#S#
sql = "insert into user (id,name) values (?,?)"; >J:=)1`
PreparedStatement ps = cn.prepareStatement(sql); 4$&l`yWU+
ps.setInt(1,xxx); /=/Ki%hh
ps.setString(2,xxx); nL:&G'd
... `]eJF|"
ResultSet rs = ps.executeQuery(); // 查询 LOx+?4|y
int c = ps.executeUpdate(); // 更新 QE(.w
dHP
mgjJNzclL
3、处理执行结果 eTx9fxw
查询语句,返回记录集ResultSet {\[ Gl
更新语句,返回数字,表示该更新影响的记录数 \tI%[g1M
ResultSet的方法 13!@LbC
1、next(),将游标往后移动一行,如果成功返回true;否则返回false }~I!'J#)
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 yQ[;y~W
I$xZV?d.
4、释放连接 /IUu-/ D
cn.close(); )Fv.eIBY
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
l!|c_
J2W-l{`r<
可滚动、更新的记录集 ~:z.Xu5m
1、创建可滚动、更新的Statement Pq omi!1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); p,fV .5q
该Statement取得的ResultSet就是可滚动的 Wm}c-GD
2、创建PreparedStatement时指定参数 V^2_]VFj
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =#G
2}8mQD
ResultSet.absolute(9000); N*-tBz
批量更新 Q*smH-Sw
1、Statement m;OvOc,
Statement sm = cn.createStatement(); (gBKC]zvz3
sm.addBatch(sql1); 8 c8`"i
sm.addBatch(sql2); +NPL.b|
... %F>~2g?$
sm.executeBatch() V*4Z.3/E5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &F&`y
2、PreparedStatement k6Kc{kY
PreparedStatement ps = cn.preparedStatement(sql); fc9;ZX7
{ 8v"rM
>[
ps.setXXX(1,xxx); ebk>e*
... *DF3juf~
ps.addBatch(); Y.viOHL
} q3$8"Q^
ps.executeBatch(); [A-_?#cZ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 03 @aG
5CkG^9
事务的处理 K|P0nJT
1、关闭Connection的自动提交 !/is+
xp
cn.setAutoCommit(false); y*i&p4Y*
2、执行一系列sql语句 2zBk#c+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close J6Z[c*W
Statement sm ; \]tBwa
sm = cn.createStatement(insert into user...); u;`]U$Qq9
sm.executeUpdate(); QHk\Z
sm.close(); Dl;hOHvKk
sm = cn.createStatement("insert into corp...); 7AqgX0)
sm.executeUpdate(); JmI%7bH@
sm.close(); 7Q .Su
3、提交 \zO.#H
cn.commit(); *d1BpR%
4、如果发生异常,那么回滚 kt6x"'"1
cn.rollback();