java 数据库基本操作 :2(U3~3:
1、java数据库操作基本流程 M A
2、几个常用的重要技巧: E]dmXH8A
可滚动、更新的记录集 oA]rwaUX
批量更新 aV`_@F-8
事务处理 g=]VQ;{
VH7nyqEM
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ![9umsx
1、取得数据库连接 V3<H8pL
1)用DriverManager取数据库连接 CWw#0
例子 b ]u01T-
String className,url,uid,pwd; %+HZ4M+hV
className = "oracle.jdbc.driver.OracleDriver";
$u
P'>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 85Red~-M
uid = "system"; XsbYWJdds
pwd = "manager";
`A ^
Class.forName(className); :.aMhyh#*
Connection cn = DriverManager.getConnection(url,uid,pwd); \2!1fN
2)用jndi(java的命名和目录服务)方式 2v?fbrC5c
例子
{Bw
String jndi = "jdbc/db"; JK'FJ}Z4
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); l~Rd\.O
DataSource ds = (DataSource) ctx.lookup(jndi); yr/G1?k%ML
Connection cn = ds.getConnection(); X)b@ia'"Wp
多用于jsp中 7B{LRm6;Vu
2、执行sql语句 2R];Pv
1)用Statement来执行sql语句 8(ej]9RObU
String sql; )J{.z
Statement sm = cn.createStatement(); |Q+:vb:
sm.executeQuery(sql); // 执行数据查询语句(select) HvzXAd
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
jH>`:
2)用PreparedStatement来执行sql语句 ^Fpc8D,
String sql; _=-B%m
sql = "insert into user (id,name) values (?,?)"; Cd2A&RB
PreparedStatement ps = cn.prepareStatement(sql); -+{<a!Nb
ps.setInt(1,xxx); #%7)a; '
ps.setString(2,xxx); (5a:O (\r
... 'M!M$<j
ResultSet rs = ps.executeQuery(); // 查询 Lz{z~xNHW.
int c = ps.executeUpdate(); // 更新 aI;-NnC
^xm%~
3、处理执行结果 Mqv[7.|
查询语句,返回记录集ResultSet cp$GP*{@
更新语句,返回数字,表示该更新影响的记录数 "Tz'j}< 9C
ResultSet的方法 !
G3Gr
1、next(),将游标往后移动一行,如果成功返回true;否则返回false AW8*bq1
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 {;vLM*
'
03H0(ku=
4、释放连接 n#^ii/H
cn.close(); e2qSU[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection A<''x'\/
gy>B
5ie
可滚动、更新的记录集 fLS].b]1N
1、创建可滚动、更新的Statement L@s_)?x0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); QtQbr*q@%
该Statement取得的ResultSet就是可滚动的 =}zSj64
2、创建PreparedStatement时指定参数 5Ky(C6E$s
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); * o{7 a$V
ResultSet.absolute(9000); /]oQqZHv
批量更新 O',Vce$
1、Statement LyH1tF
Statement sm = cn.createStatement(); Q$(Fma 4a
sm.addBatch(sql1); ZeLed[J^xJ
sm.addBatch(sql2); !|\l*
... 4-m6e$p;
sm.executeBatch() %+^Qs\j
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 zf;sdQ;4
2、PreparedStatement Y'C1L4d
PreparedStatement ps = cn.preparedStatement(sql); =M=v;
,I-
{ 8W Etm}
ps.setXXX(1,xxx); PdtL
Cgd
... 1xI
ps.addBatch(); $C{,`{=
} _ee<i8_Va
ps.executeBatch(); LU/;`In
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 EpH_v`
|'-%d^Z
事务的处理 F1meftK
1、关闭Connection的自动提交 N "}N>xe2
cn.setAutoCommit(false); Ej8g/{
2、执行一系列sql语句 s'|t2`K("
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !<24Cy
Statement sm ; $*|M+ofQ
sm = cn.createStatement(insert into user...); cj9C6Y!
sm.executeUpdate(); m!5Edo-;<
sm.close(); ~7anj.
sm = cn.createStatement("insert into corp...); >x>/}`
sm.executeUpdate(); 9dmoB_G
sm.close(); u'nQC*iJb
3、提交 $,P:B%]
cn.commit(); J$5Vjh'aM
4、如果发生异常,那么回滚 %&S9~E
D
cn.rollback();