java 数据库基本操作 _qY`KP"
1、java数据库操作基本流程 R(: 4s
2、几个常用的重要技巧: T$H2'tK|
可滚动、更新的记录集 rGTWcJ
批量更新 PSW#^o
事务处理 R'G'&H{N
xik`W!1S
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 >65
TkAp
1、取得数据库连接 X$BXT
1)用DriverManager取数据库连接 `Uzs+k-]
例子 rW:iBq
String className,url,uid,pwd; Ab*]dn`z
className = "oracle.jdbc.driver.OracleDriver"; ]@*tfz\YaH
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; GS}0;x
uid = "system"; so} l#
pwd = "manager"; ;e&!
Class.forName(className); wX-RQ[2X
Connection cn = DriverManager.getConnection(url,uid,pwd); myD{sE2A
2)用jndi(java的命名和目录服务)方式 1 h<fJzh
例子 'To<T
String jndi = "jdbc/db"; 3QCMK^#Z:
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ewo*7j4*
DataSource ds = (DataSource) ctx.lookup(jndi); XDHLEG-u(
Connection cn = ds.getConnection(); Lb!r(o>8Cb
多用于jsp中 dO+kPC
2、执行sql语句 7k3p'FeS
1)用Statement来执行sql语句 HKpD2M
String sql; PdR >;$1
Statement sm = cn.createStatement(); Qqp)@uM^
sm.executeQuery(sql); // 执行数据查询语句(select) PT mf
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); > P(eW7RL
2)用PreparedStatement来执行sql语句 :OHSxb>[
String sql;
q4_**
sql = "insert into user (id,name) values (?,?)"; gk"mr_03
PreparedStatement ps = cn.prepareStatement(sql); D2Y&[zgv
ps.setInt(1,xxx); F
b1EMVu
ps.setString(2,xxx); `Gf{z%/
... !{IC[g n
ResultSet rs = ps.executeQuery(); // 查询 jUYF.K&
int c = ps.executeUpdate(); // 更新 YjFWC!Qj$
=]T|h
3、处理执行结果 [d0%.+U
查询语句,返回记录集ResultSet DK)u)?!
更新语句,返回数字,表示该更新影响的记录数 Fl<(m
ResultSet的方法 K~USK?Q%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false CP +4k.)*O
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Wt(Kd5k0'2
?;Un#6b
4、释放连接 -zprNQW
cn.close(); R3$@N
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .Nc_n5D6
Pow|:Lau!
可滚动、更新的记录集 ,`<]>;s
1、创建可滚动、更新的Statement Bgf=\7;5
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); mLJDxh'B
该Statement取得的ResultSet就是可滚动的 $> ;a'f~
2、创建PreparedStatement时指定参数 $;y1Qiel
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Cgo9rC~]
ResultSet.absolute(9000); gTnS[
批量更新 oK)[p!D?0{
1、Statement &%6NQWW
Statement sm = cn.createStatement(); Q]/B/
sm.addBatch(sql1);
t7&Dwmck9
sm.addBatch(sql2); 9MT3T?IS
... 3#9uEDdE
sm.executeBatch() RXM}hqeG
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 am2a#4`
2、PreparedStatement A$Wx#r7)
PreparedStatement ps = cn.preparedStatement(sql); 0EyAMu
{ 691G15
ps.setXXX(1,xxx); ]s_@n!
... au}s=ua~i
ps.addBatch(); "tKNlHBu'
} t|.Ft<c#
ps.executeBatch(); .W$
sxVXB
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7g5@vYS+
zb>;?et;)
事务的处理 yu=piP
1、关闭Connection的自动提交 wsqLXZI
cn.setAutoCommit(false); <iRWd
2、执行一系列sql语句 X3AwM%,!
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close zLL)VFCJW
Statement sm ; b) Ux3PB
sm = cn.createStatement(insert into user...); cg{Gc]'1#
sm.executeUpdate(); @/LiR>,
sm.close(); vffH
sm = cn.createStatement("insert into corp...); "(<%Ua
sm.executeUpdate(); Y_+
SA|s
sm.close(); [$;,Ua-mt
3、提交 W=3? x
cn.commit(); V;k#})_-
4、如果发生异常,那么回滚 l**3%cTb
cn.rollback();