java 数据库基本操作
E}NX+ vYF
1、java数据库操作基本流程 Q|5wz]!5Y(
2、几个常用的重要技巧: (|U+ (~PJ
可滚动、更新的记录集 t9m`K9.\
批量更新 &OI=rvDmo
事务处理 .\U+`>4av
ZLL0 6p
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `n^jU92
1、取得数据库连接 qk_
s"}sS
1)用DriverManager取数据库连接 ~ S-x-cZ
例子 ?WAlW,H>
String className,url,uid,pwd; ]-* }-j`
className = "oracle.jdbc.driver.OracleDriver"; O)9T|,
U
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; PI?-gc?[
uid = "system"; fd+kr#
pwd = "manager"; {ReAl_Cm
Class.forName(className); |AFF*]e S
Connection cn = DriverManager.getConnection(url,uid,pwd); / _}v|E0
2)用jndi(java的命名和目录服务)方式 H>M%5bj
例子 8kMMQ ES
String jndi = "jdbc/db"; kJDMIh|g
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); t4gD*j6J3
DataSource ds = (DataSource) ctx.lookup(jndi); sp_(j!]jX
Connection cn = ds.getConnection(); 7FMHz.ZRE
多用于jsp中 %{}Jr`
2、执行sql语句 3tr?-l[N\
1)用Statement来执行sql语句 0.@/I}R[
String sql; #h r!7Kc;N
Statement sm = cn.createStatement(); }Bc6:a
sm.executeQuery(sql); // 执行数据查询语句(select) -CL7^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); i6X/`XW'
2)用PreparedStatement来执行sql语句 MH !CzV&
String sql; .7)A8R7Wt
sql = "insert into user (id,name) values (?,?)"; gpw(j0/Fs
PreparedStatement ps = cn.prepareStatement(sql); /u #9M {
ps.setInt(1,xxx); B1LnuB%
ps.setString(2,xxx); *\joaw
... l,v:[N
ResultSet rs = ps.executeQuery(); // 查询 x7NxHTL
int c = ps.executeUpdate(); // 更新 RIJBHOa
m7RWu I,
3、处理执行结果 iz*aBXV A[
查询语句,返回记录集ResultSet {g @
*jo&
更新语句,返回数字,表示该更新影响的记录数 a#raUF7e
ResultSet的方法 ]AHUo;(f%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false J| 'T2g
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 <c\aZ9+V
B]Zsn`n
4、释放连接 LG,RF:
cn.close(); ^
1J;SO|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection n:#ji|wM
Xp{gh@#dr
可滚动、更新的记录集 y!v $5wi
1、创建可滚动、更新的Statement @{nT4{
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Vm6^'1CY
该Statement取得的ResultSet就是可滚动的
u*9C(je
2、创建PreparedStatement时指定参数 MiSFT5$v6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ab(bvS8r$
ResultSet.absolute(9000); Cog:6Gnw
批量更新 (+^1'?C8
1、Statement +m+HC(Z
Statement sm = cn.createStatement(); W:) M}}&H
sm.addBatch(sql1); Jp=
(Q]ab
sm.addBatch(sql2); vW4f 3(/
... -_4! id
sm.executeBatch() @C!q S7k)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ED$gnFa3I
2、PreparedStatement gf3/ kll9
PreparedStatement ps = cn.preparedStatement(sql); 3[e@mcO
{ 1:&$0jU&U
ps.setXXX(1,xxx); u5,IH2BU
... ZR#UoYjupb
ps.addBatch(); PkVXn
} }F3Z~
ps.executeBatch(); "^trHh8=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~z
aV.3#
~P/G^cV3s
事务的处理 Yb6\+}th
1、关闭Connection的自动提交 6C3y+@9
cn.setAutoCommit(false); qb9%Y/xy
2、执行一系列sql语句 WYh7Y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~cZ1=,P
Statement sm ; 19=Dd#Nf
sm = cn.createStatement(insert into user...); sV*Q8b*
sm.executeUpdate(); 3;M!]9ms
sm.close(); I+<; Dsp
sm = cn.createStatement("insert into corp...); =k8A7P
sm.executeUpdate(); +L49
pv5
sm.close(); ~}M{[6!
3、提交 keWgbj
cn.commit(); d@l;dos),
4、如果发生异常,那么回滚 CjST*(,b
cn.rollback();