java 数据库基本操作 PK}vh%
1、java数据库操作基本流程 e z+yP,.#
2、几个常用的重要技巧: )6 k1 P
可滚动、更新的记录集 3u4:l
批量更新 0:#7M}U
事务处理 ZHcONYAr
Y.X4*B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 DiR'p`b~
1、取得数据库连接 )gjGG8Ee
1)用DriverManager取数据库连接 4gya]
例子 pkW5D
String className,url,uid,pwd; VW~Xbyf
className = "oracle.jdbc.driver.OracleDriver"; VRB~7\A5<)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; xRB7lV*
uid = "system"; ivD^HhG
pwd = "manager"; $Ba`VGP>)3
Class.forName(className); Qi"'bWX@
Connection cn = DriverManager.getConnection(url,uid,pwd); j=\Mx6os
2)用jndi(java的命名和目录服务)方式 ,$ mLL
例子 I^@.Awt
String jndi = "jdbc/db"; HGb.656r
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); V>r j$Nc]
DataSource ds = (DataSource) ctx.lookup(jndi); 5)8.
Connection cn = ds.getConnection(); 0NrTJ R`
多用于jsp中 &<@%{h@=
2、执行sql语句 rXuAixu!t
1)用Statement来执行sql语句 .c03}RTC^
String sql; (qbc;gBy
Statement sm = cn.createStatement(); UC(9Dz
sm.executeQuery(sql); // 执行数据查询语句(select) $^ubo5%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %^T!@uZr
2)用PreparedStatement来执行sql语句 rX:1_q`xA
String sql; 38"cbHE3
sql = "insert into user (id,name) values (?,?)"; n{3|E3
PreparedStatement ps = cn.prepareStatement(sql); L*v93;|s
ps.setInt(1,xxx); 9[Y*k^.!
ps.setString(2,xxx); O[L\T
... K]9tc)
ResultSet rs = ps.executeQuery(); // 查询 rCkYfTYI
int c = ps.executeUpdate(); // 更新 }.OxJ=M
h>.9RX &
3、处理执行结果 pb6 Q?QG,
查询语句,返回记录集ResultSet Z+Xc1W^
更新语句,返回数字,表示该更新影响的记录数 OK.-]()!
ResultSet的方法 }d@LSaM
1、next(),将游标往后移动一行,如果成功返回true;否则返回false T6;>O`B.r
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 N:d
D*[QZ
PJ}[D.elO
4、释放连接 \k4M{h6
cn.close(); tfsh!)u?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &`m~o/
%Dl_}
可滚动、更新的记录集 ea>[BB3#
1、创建可滚动、更新的Statement wD}EW
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _m" ^lo
该Statement取得的ResultSet就是可滚动的 b6]e4DL:R
2、创建PreparedStatement时指定参数 f7S^yA[[
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Bg5;Q)
ResultSet.absolute(9000); %@o&*pF^,
批量更新 u^!&{ q
1、Statement A
xRl*B
Statement sm = cn.createStatement(); ??q!jm-m
sm.addBatch(sql1); FDl,Ey^r/
sm.addBatch(sql2); A7.JFf>
... O-?z' @5cI
sm.executeBatch() f x%z|K
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 EmF]W+!z%
2、PreparedStatement 1 iquHn
PreparedStatement ps = cn.preparedStatement(sql); J tThkh'-"
{ cj`#Tg.
ps.setXXX(1,xxx); JE/l#Q!
... O3!Ouh&
ps.addBatch(); zo/0b/lQ
} GCZu<,
ps.executeBatch(); t;oT {Hge
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )Gx":
D
a
pKa4nI
事务的处理 g<0w/n!jmC
1、关闭Connection的自动提交 Ja^7$WY
cn.setAutoCommit(false); J6= w:c
2、执行一系列sql语句 1k*n1t):
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Hxj'38Y
Statement sm ; O\3r%=TF
sm = cn.createStatement(insert into user...); LRhP7D+A
sm.executeUpdate(); R%qX_m\0
sm.close(); (R,NV3m?w
sm = cn.createStatement("insert into corp...); A>H*`{}
sm.executeUpdate(); 3x,Aczb
sm.close(); 4S^
3、提交 XryQ)x(
cn.commit(); @"jmI&hYn
4、如果发生异常,那么回滚 5?D1][
cn.rollback();