java 数据库基本操作 R#Hz%/:|A
1、java数据库操作基本流程 @RFJe$%
2、几个常用的重要技巧: 5{O9<~,
可滚动、更新的记录集
&L4>w.b"N
批量更新 >'2=3L^Q
事务处理 @rt}z+JF
8VR!
Y0`e
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 \:`-"Ou(*
1、取得数据库连接 )SsO,E+t=U
1)用DriverManager取数据库连接 e[*%tx H
例子 A!fRpN
String className,url,uid,pwd; )b;}]C
className = "oracle.jdbc.driver.OracleDriver"; C &-]RffA
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; nj5Hls
uid = "system"; 1n )&%r
pwd = "manager"; LCkaSv/[RB
Class.forName(className); N2e]S8-
Connection cn = DriverManager.getConnection(url,uid,pwd); fW8whN
2)用jndi(java的命名和目录服务)方式 `Uy'YfYF
例子 N"&qy3F
String jndi = "jdbc/db"; +U*:WKdI?
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \K(QE ~y'W
DataSource ds = (DataSource) ctx.lookup(jndi); }@Ou]o
Connection cn = ds.getConnection(); HC/?o0
多用于jsp中 #JW~ &;
2、执行sql语句 2&d|L|->
1)用Statement来执行sql语句 YKG}4{T
String sql; +n&9ZCH
Statement sm = cn.createStatement(); 6T ,'Oz
sm.executeQuery(sql); // 执行数据查询语句(select) E.+BqWZ!
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Tl`HFZQ1
2)用PreparedStatement来执行sql语句 0rj50$~$]
String sql; RqRyZ*n
sql = "insert into user (id,name) values (?,?)"; e{7"7wn=
PreparedStatement ps = cn.prepareStatement(sql); muKCCWy#
ps.setInt(1,xxx); B{\qYL/~
ps.setString(2,xxx); /E<:=DD<
... `CF.-Vl3J#
ResultSet rs = ps.executeQuery(); // 查询 1]]#HTwX
int c = ps.executeUpdate(); // 更新 $V2.@X
rX@?~(^ML
3、处理执行结果 P*.0kR1n
查询语句,返回记录集ResultSet {;E]#=|
更新语句,返回数字,表示该更新影响的记录数 LGPPyKNx
ResultSet的方法 ]Wdnr1d~8
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |tqYRWn0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]aTF0 R
4+'d">+|
4、释放连接 tB==v{t
cn.close(); wTkcR^
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,%EGM+
vfPIC!
可滚动、更新的记录集 ]iE)8X
1、创建可滚动、更新的Statement ~5sH`w~vQ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 3KN>t)A#
该Statement取得的ResultSet就是可滚动的 DZ5QC aA
2、创建PreparedStatement时指定参数 5;_&C=[
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); gO,2:,
ResultSet.absolute(9000); lz88//@gZ
批量更新 *J|]E(
1、Statement Ab/KVB
Statement sm = cn.createStatement(); bo04y)Iz
sm.addBatch(sql1); )9'Zb`n
sm.addBatch(sql2); do&0m[x%
... c3q @]|aI
sm.executeBatch() UcxMA%Pw7$
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 v!77dj 6I
2、PreparedStatement nHTb~t5Ke
PreparedStatement ps = cn.preparedStatement(sql); Mv#\+|p 1x
{ yi@mf$A|
ps.setXXX(1,xxx); IBSoAL
... Zq\Vq:MX
ps.addBatch(); S1D;Xv@
} 'ghwc:Og|%
ps.executeBatch(); o]O
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 X Cf!xIv
4oywP^I
事务的处理 -VP da @@w
1、关闭Connection的自动提交 vQhi2J'
cn.setAutoCommit(false); ^dCSk==
2、执行一系列sql语句 ;/|3U7{c
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close cu#s}*Ip
Statement sm ; >J>|+W
sm = cn.createStatement(insert into user...); Aa`'g0wmc
sm.executeUpdate(); XX|wle1Kg
sm.close(); tj;<EaM
sm = cn.createStatement("insert into corp...); y&{ Z"+B5
sm.executeUpdate(); 9d1 Gu"
sm.close(); n 9N'}z
3、提交 QB|D_?]
cn.commit(); h(Ccm44
4、如果发生异常,那么回滚 [$P.ek<
cn.rollback();