java 数据库基本操作 Qx6/QaS?
1、java数据库操作基本流程 O)Qz$
2、几个常用的重要技巧: l#"alU!<^
可滚动、更新的记录集 n1t(ns|
批量更新 yRYWx` G
事务处理 s]N-n?'G"
j[fQs,efK
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 LnDj
1、取得数据库连接 -b$OHFL
1)用DriverManager取数据库连接 Q#N+5<]J)#
例子 1+jYpYEQW
String className,url,uid,pwd; rTm{-b)r
className = "oracle.jdbc.driver.OracleDriver"; d.AjH9 jg
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 9yh@_~rZ
uid = "system"; zFn&~lFB
pwd = "manager"; `@M4THt
Class.forName(className); LC{hoq\
Connection cn = DriverManager.getConnection(url,uid,pwd);
FNuu ',:
2)用jndi(java的命名和目录服务)方式 2X*<Fma3C
例子 MT`gr
String jndi = "jdbc/db"; @r ?`:&m0
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _Pkh`}W:
DataSource ds = (DataSource) ctx.lookup(jndi); p5l$On
Connection cn = ds.getConnection(); Dkb&/k:)
多用于jsp中 bw\=F_>L
2、执行sql语句 (Pd>*G\
1)用Statement来执行sql语句 =M5M;
String sql; P1wRt5
Statement sm = cn.createStatement(); ='0!B]<G
sm.executeQuery(sql); // 执行数据查询语句(select) vR$5ItnT
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); &w0=/G/T=~
2)用PreparedStatement来执行sql语句 0I((UA/7Zs
String sql; kKM%
sql = "insert into user (id,name) values (?,?)"; b..$5
PreparedStatement ps = cn.prepareStatement(sql); udFju&!W
ps.setInt(1,xxx); pG
@iR*?
ps.setString(2,xxx); %?hLo8
... 6W=:`14
ResultSet rs = ps.executeQuery(); // 查询 "^z=r]<5
int c = ps.executeUpdate(); // 更新
A232"p_
E5 oD|'=WA
3、处理执行结果 Y2-bU 7mo
查询语句,返回记录集ResultSet >n~p1: $
更新语句,返回数字,表示该更新影响的记录数 H Im,
"iYk
ResultSet的方法 S=p u
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7Ca\ (82
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 MuGg
z>CV[
3.X0!M;x
4、释放连接 qJU)d
cn.close(); kW&Z%k
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection qD*\}b]9I
LFyceFbm
可滚动、更新的记录集 l7,qWSsnK
1、创建可滚动、更新的Statement 1`lFF_stkP
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ~,2hP
~
该Statement取得的ResultSet就是可滚动的 ^4pKsO3ul
2、创建PreparedStatement时指定参数 o2 d~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); suFOc
ResultSet.absolute(9000); T''+zk
批量更新 Ts .Zl{B
1、Statement Ki/5xK=s
Statement sm = cn.createStatement(); Xp6*Y1Y
sm.addBatch(sql1); 4QAIQQS
sm.addBatch(sql2); WN+Jf
... _|3TC1N$n
sm.executeBatch() ACO4u<M)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 DA)v3Nd
2、PreparedStatement =zeLs0s;
PreparedStatement ps = cn.preparedStatement(sql); 1\*B.
{ vQmackY
ps.setXXX(1,xxx); !`[I>:Ex
... DXW?;|8)O
ps.addBatch(); 8$ZSF92C
} wp.e3l
ps.executeBatch(); 9}cuAVI
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Q5nyD/k4c
Ln2C#Uf
事务的处理 1L8ULxi_?]
1、关闭Connection的自动提交 qMES<UL>
cn.setAutoCommit(false); gH^$Y~Lx
2、执行一系列sql语句 xeM':hD.o
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close IXvz&4VD
Statement sm ; =8p+-8M[d
sm = cn.createStatement(insert into user...); ASZ5;N4u
sm.executeUpdate(); KM}4^Qc
sm.close(); )]>G,.9C}
sm = cn.createStatement("insert into corp...); 3
9{"T0
sm.executeUpdate(); eM=) >zl
sm.close(); lzs(i2pA
3、提交 *rcuhw"^b#
cn.commit(); S"TMsi
4、如果发生异常,那么回滚 CKt|c!3 7
cn.rollback();