java 数据库基本操作 8+1tys
1、java数据库操作基本流程 ( Qw"^lE3
2、几个常用的重要技巧: dg1h<]T"9
可滚动、更新的记录集 .Eg>)
批量更新 @vaK-&|#$
事务处理 Vj"B#
v}ZQC8wL
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `:A`%Fg8<
1、取得数据库连接 eJ#q! <
1)用DriverManager取数据库连接 ``}EbOMG
例子 8:,l+[\
String className,url,uid,pwd; X] &Q^
className = "oracle.jdbc.driver.OracleDriver"; m>'sM1s
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (;' ?56
uid = "system"; <gKT 7ONtg
pwd = "manager"; b^\u
P
Class.forName(className); Hs8c%C
Connection cn = DriverManager.getConnection(url,uid,pwd); ><[($Gq`g
2)用jndi(java的命名和目录服务)方式 ,P<n\(DQ
例子 Kuy,qZv!"
String jndi = "jdbc/db"; ^60BQ{ne
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); iFW)}_.
DataSource ds = (DataSource) ctx.lookup(jndi); Q': }'CI
Connection cn = ds.getConnection(); -[4Xg!apO
多用于jsp中 R1FBH:Iu
2、执行sql语句 (&FSoe/!['
1)用Statement来执行sql语句 Cv|ya$}a
String sql; Q%(LMq4UG
Statement sm = cn.createStatement(); W^q;=D6uh
sm.executeQuery(sql); // 执行数据查询语句(select) 'kK}9VKl
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Y`3>i,S6\
2)用PreparedStatement来执行sql语句 wbzAX
String sql;
wEo/H
sql = "insert into user (id,name) values (?,?)"; n9Z|69W6>
PreparedStatement ps = cn.prepareStatement(sql); 41WnKz9c
ps.setInt(1,xxx); [C)-=.Xx)j
ps.setString(2,xxx); Be+vC=\K
... d:6?miMH]t
ResultSet rs = ps.executeQuery(); // 查询 xGJ{_M
int c = ps.executeUpdate(); // 更新 o64&BpCK
mV}
peb
3、处理执行结果 &CFHH"OsT
查询语句,返回记录集ResultSet /v
E >*x
更新语句,返回数字,表示该更新影响的记录数 B]q
&?~
ResultSet的方法 ~&=-*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {
D1.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 T2
0dZ8{y
_YY:}'+
4、释放连接 *?K3jy{
cn.close(); hp!UW
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection )W~w72j-
# &o3[.)9
可滚动、更新的记录集 !L+*.k:
1、创建可滚动、更新的Statement |Z<NM#1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `(?E-~#'
该Statement取得的ResultSet就是可滚动的 !12W(4S5
2、创建PreparedStatement时指定参数 H~1*`m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -#H>kbs
ResultSet.absolute(9000); Bhl@\Kq
批量更新 Ft>Abj,6
1、Statement IDb|J%e^P
Statement sm = cn.createStatement(); %zyO}
sm.addBatch(sql1); _* ] ~MQ=
sm.addBatch(sql2); n3-u.Fb
... PBb@J'b
sm.executeBatch() >n)N=Zyu
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 V4}9f5FR
2、PreparedStatement HjV3PFg
PreparedStatement ps = cn.preparedStatement(sql); -4o6 OkK<
{ .OVIQxf
ps.setXXX(1,xxx); nM1U=Du
... BDyOX6
ps.addBatch(); q4PRc<\^
} hVI
$r
ps.executeBatch(); Y(ly0U}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 r>sk@[4h
f7}/ {}g
事务的处理 Z}TuVE
1、关闭Connection的自动提交 <P7f\$o~
cn.setAutoCommit(false); &C<B=T"I
2、执行一系列sql语句 |_8-3
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close cOthq87:
Statement sm ; bN@V=C3
sm = cn.createStatement(insert into user...); 4r`u@
sm.executeUpdate(); @kn0f`
sm.close(); ^)conSm
sm = cn.createStatement("insert into corp...); /i$E |[
sm.executeUpdate(); _` |Hk2O
sm.close(); |AW[4Yn>
3、提交 gX5I`mm
cn.commit(); dU\,>3tG
4、如果发生异常,那么回滚 V6?ku6k
cn.rollback();