java 数据库基本操作 B$Z%_j&
1、java数据库操作基本流程 Qb.Ve7c
2、几个常用的重要技巧: .J0Tn,m
可滚动、更新的记录集 ($h`Y;4
批量更新 uPmK:9]3R
事务处理 gPW% *|D,
u6B,V
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 o4^|n1vN
1、取得数据库连接 DR%16y<h
1)用DriverManager取数据库连接 WRBCNra
例子 ZM6`:/lc
String className,url,uid,pwd; K+s@.D9J
className = "oracle.jdbc.driver.OracleDriver"; SU,#:s(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~$WBc qo
uid = "system"; c\J?J>xz
pwd = "manager"; !Qqi%
Class.forName(className); eTeZ^G
Connection cn = DriverManager.getConnection(url,uid,pwd); +E7Os|m
2)用jndi(java的命名和目录服务)方式 nT;Rwz$3
例子 +.EP_2f9
String jndi = "jdbc/db"; Az`c ?
W%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); UdiogXZ
DataSource ds = (DataSource) ctx.lookup(jndi); ,:E*Mw:
Connection cn = ds.getConnection(); \~(scz$
多用于jsp中 mSg{0_:
2、执行sql语句 "CX@a"
1)用Statement来执行sql语句 uZg[PS=@!X
String sql; ~l^Q~W-+
Statement sm = cn.createStatement(); I*SrKZb
sm.executeQuery(sql); // 执行数据查询语句(select) :rBPgrt
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); U5iyvU=UG
2)用PreparedStatement来执行sql语句 \~r`2p-K
String sql; Cwh*AKq(
sql = "insert into user (id,name) values (?,?)"; 6dNW2_
PreparedStatement ps = cn.prepareStatement(sql); TEzMFu+V
ps.setInt(1,xxx); 9sgyg3fv>5
ps.setString(2,xxx); pGsk[.
... k6}M7&nY
ResultSet rs = ps.executeQuery(); // 查询 *K57($F
int c = ps.executeUpdate(); // 更新 TI<?h(*R_
Q|6lp
3、处理执行结果 ]U,c`?[7#
查询语句,返回记录集ResultSet X%Lhu6F
更新语句,返回数字,表示该更新影响的记录数 pz hPEp;
ResultSet的方法 NKSK+ll2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;UAi>//#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Qvx[F:#Tk
P4VMGP
4、释放连接 YcmLc)a7
cn.close(); ~~B`\!n7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection AW R
F?Fs x)2k
可滚动、更新的记录集 R ^ln-H;
1、创建可滚动、更新的Statement G2[?b2)8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )@Vz,f\}
该Statement取得的ResultSet就是可滚动的 k$ORV U
2、创建PreparedStatement时指定参数 Gkr]8J
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); `xq/<U;i
ResultSet.absolute(9000); Fs3rsig
批量更新 I&Z4?K
1、Statement Rt9S
Statement sm = cn.createStatement(); '|7'dlW
sm.addBatch(sql1); Cd7imj
sm.addBatch(sql2); YjR`}rdwo
... Sc/\g
sm.executeBatch() \Qgc7ev
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ;k=&ZV
2、PreparedStatement c{,VU.5/
PreparedStatement ps = cn.preparedStatement(sql); %FhUjHm
{ nn?h;KzB
ps.setXXX(1,xxx); y!kU0
... e|e"lP
ps.addBatch(); kR
!O-@GJ]
} 6/=0RTd
ps.executeBatch(); J6C/`)+w
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 LFskNF0X
$SbgdbX
事务的处理 fN!lXPgM
1、关闭Connection的自动提交 ZYexW=@
cn.setAutoCommit(false); GL^84[f-T
2、执行一系列sql语句 #1z/rUh`Cr
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close i>aIuQ`pe
Statement sm ; I)AbH<G{
sm = cn.createStatement(insert into user...); {2v,J]v_[
sm.executeUpdate(); SmUj8?6"
sm.close(); ;]PP+h
sm = cn.createStatement("insert into corp...); Mjj5~by:
sm.executeUpdate(); ; "K"S[
sm.close(); sq45fRAi
3、提交 %ZR<z$
cn.commit(); O,[9E
4、如果发生异常,那么回滚 _)%Sz"g^Ix
cn.rollback();