java 数据库基本操作 ,(;p(#F>
1、java数据库操作基本流程 tEpIyC
2、几个常用的重要技巧: >
{'5>6u
可滚动、更新的记录集 j?d;xj
批量更新 SdjUhR+o
事务处理 Z`SWZ<
t1.zWe+C>3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 !q7;{/QM6
1、取得数据库连接 w~cq%%
1)用DriverManager取数据库连接 &;r'{$
例子 Cg]3(3
String className,url,uid,pwd; m11"i=S"
className = "oracle.jdbc.driver.OracleDriver"; k"3Z@Px:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "/ a*[_sV
uid = "system"; LV[66<T
pwd = "manager"; 4U LJtM3
Class.forName(className); ?9wFV/
Connection cn = DriverManager.getConnection(url,uid,pwd); !4qps$p{
2)用jndi(java的命名和目录服务)方式 p[af[!
例子 :>AW@SoTp
String jndi = "jdbc/db"; 1`2);b{@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); rE
bx%u7Q
DataSource ds = (DataSource) ctx.lookup(jndi); hB2s$QS
Connection cn = ds.getConnection(); iECC@g@a
多用于jsp中 q>D4ma^
2、执行sql语句 &F<J#cfe8
1)用Statement来执行sql语句 " kE:T.,
String sql; Tv*1q.MB
Statement sm = cn.createStatement(); &2P:A
sm.executeQuery(sql); // 执行数据查询语句(select) k@cZ"jYA
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); yP<:iCY
2)用PreparedStatement来执行sql语句 G>_42Rp
String sql; (d5vH)+A
sql = "insert into user (id,name) values (?,?)"; pR@GvweA
PreparedStatement ps = cn.prepareStatement(sql); -6em*$k^
ps.setInt(1,xxx); Xd19GP!
ps.setString(2,xxx); [pRVZV
... v
,G-k2$Qe
ResultSet rs = ps.executeQuery(); // 查询 G]m[S-
int c = ps.executeUpdate(); // 更新 *1ID`o
Ul7pxzj
3、处理执行结果 @>
+^<
查询语句,返回记录集ResultSet pZ@W6}
更新语句,返回数字,表示该更新影响的记录数 X,iuz/Q
ResultSet的方法 eK=m0 2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false W=;(t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 YN5OuKMUd'
R5'Z4.~
4、释放连接 v4,syd*3|V
cn.close(); kw}ISXz v
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 'EH
Gg3?2h"d
可滚动、更新的记录集 ~'Qpf 8)
1、创建可滚动、更新的Statement ^%4(
%68
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); mNBpb}
该Statement取得的ResultSet就是可滚动的 x jP" 'yU
2、创建PreparedStatement时指定参数 +lDGr/
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F-reb5pt.=
ResultSet.absolute(9000); *+,Lc1|\
批量更新 SCI-jf3WN
1、Statement 56O<CgJF<
Statement sm = cn.createStatement(); )z4kP09
sm.addBatch(sql1); !5'
8a5
sm.addBatch(sql2); a dz;N;rIY
... gqHH Hh
sm.executeBatch() &]"_pc/>m
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 go%X%Os]
2、PreparedStatement nkCRe
PreparedStatement ps = cn.preparedStatement(sql); <'4!G"_EP
{ LF-+5`
ps.setXXX(1,xxx); KoQ_:`
... *`pec3"
ps.addBatch(); O+8ApicjTc
} 8^f[-^%
ps.executeBatch(); pn_gq~5ng
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。
:[X}.]"
Ie`SWg*WL
事务的处理 &:cTo(C'
1、关闭Connection的自动提交 d)17r\*>I
cn.setAutoCommit(false); 5f^`4pT
2、执行一系列sql语句 fB @pwmu
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close m|?"
k38
Statement sm ; 5@%=LPV
sm = cn.createStatement(insert into user...); "|l
oSf@
sm.executeUpdate(); ).O2_<&?F
sm.close(); wJ]$'c3
sm = cn.createStatement("insert into corp...); %.atWX`b
sm.executeUpdate(); D!D%.
sm.close(); WE Svkm;
3、提交 m?R+Z6c[
cn.commit(); U}vtVvx
4、如果发生异常,那么回滚 (EF$^FYPK
cn.rollback();