java 数据库基本操作 S|h
m
1、java数据库操作基本流程 H~K2`Cr)4
2、几个常用的重要技巧: ;rdLYmmx^
可滚动、更新的记录集 Nfvg[c
批量更新 6$;)CO!h
事务处理 KD*4n'm!>
r?>Hg+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {v'Fg
1、取得数据库连接 ! \Kh\
1)用DriverManager取数据库连接 71ybZ 0
例子 )_ u'k /
String className,url,uid,pwd; VDN]P3
className = "oracle.jdbc.driver.OracleDriver"; ^0~1/ PhOw
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Pz!yIj
uid = "system"; ZDD|MH
pwd = "manager"; WU@,1.F:
Class.forName(className); PiQs><FK8
Connection cn = DriverManager.getConnection(url,uid,pwd); a6#PZ!1
2)用jndi(java的命名和目录服务)方式 ^aoLry&i=
例子 <b40\Z{+
String jndi = "jdbc/db"; xfSvvCy
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *9&YkVw~
DataSource ds = (DataSource) ctx.lookup(jndi); ar}759
Connection cn = ds.getConnection(); -"L6^IH7
多用于jsp中 >k-poBw
2、执行sql语句 :Djp\
e6!
1)用Statement来执行sql语句 A|-\C$
String sql; e5]0<s$
Statement sm = cn.createStatement(); 7FFYSv,[:
sm.executeQuery(sql); // 执行数据查询语句(select) k3kqgR*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;VBfzFH
2)用PreparedStatement来执行sql语句 ^}L$[P
String sql; bGa":|}F
sql = "insert into user (id,name) values (?,?)"; 5X-(@GwN
PreparedStatement ps = cn.prepareStatement(sql); " <AljgF
ps.setInt(1,xxx); FeMu`|2
ps.setString(2,xxx); <K'gvMG[
... (#Aq*2Z.
ResultSet rs = ps.executeQuery(); // 查询 bV,R*C
int c = ps.executeUpdate(); // 更新 DF =.G1
W=w@SO_?wp
3、处理执行结果 Zt=X
%M|aw
查询语句,返回记录集ResultSet xI8*sTx
6
更新语句,返回数字,表示该更新影响的记录数 K;lC#
ResultSet的方法 m%3Kq%?O
1、next(),将游标往后移动一行,如果成功返回true;否则返回false GTvb^+6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ?xs0J
!*-cf$
4、释放连接 :gtwvM7/B
cn.close(); i9"1
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection "de:plMofy
c6|&?}F
可滚动、更新的记录集 DdgFBO
1、创建可滚动、更新的Statement h]$zub
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /#5ZP\e
该Statement取得的ResultSet就是可滚动的 JN!YRcj
2、创建PreparedStatement时指定参数 )]R8
$S
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); "bH ~CG:Y
ResultSet.absolute(9000); q<7n5kJ~
批量更新 w6 .HvH-@?
1、Statement JTJ4a8DE
Statement sm = cn.createStatement(); mt'#j"mU
sm.addBatch(sql1); hSH-Ck@Qy
sm.addBatch(sql2); ,-Gw#!0
... L|?tcic
sm.executeBatch() x.RZ!V-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Q1yTDJ(2
2、PreparedStatement C5z4%,`f
PreparedStatement ps = cn.preparedStatement(sql); Y._AzJ&B[
{ Rz]bCiD3
B
ps.setXXX(1,xxx); -9EbU7>!
... *<1m
2t>.
ps.addBatch(); UHWunI S
} F Te# @\I
ps.executeBatch(); CqV
\:50g
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 tA.C"
R,lr&;a8
事务的处理 ^D)C|T
1、关闭Connection的自动提交 3t'K@W?AJh
cn.setAutoCommit(false); [<t*&Kr+o
2、执行一系列sql语句 kE}?"<l
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close xuF_^
Statement sm ; !;-x]_
sm = cn.createStatement(insert into user...); |QdS;
sm.executeUpdate(); S"l&=J2dc
sm.close(); 9Wn0YIc
sm = cn.createStatement("insert into corp...); ly2R8$Y`y`
sm.executeUpdate(); ,D1QJPM
sm.close(); ]g :ZokU
3、提交 "( xu
cn.commit(); AXFVsZH"zi
4、如果发生异常,那么回滚 0OXd*
cn.rollback();