java 数据库基本操作 KFdTw{GlJ7
1、java数据库操作基本流程 )_OKw?Zi
2、几个常用的重要技巧:
z%;b-PpS
可滚动、更新的记录集 gmy$_4+6o
批量更新 F0%FX`b{{
事务处理 1`N q
K
}3F8[Td.~N
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (,`ypD +3q
1、取得数据库连接 9hEIf,\
1)用DriverManager取数据库连接 1q<BYc+z
例子 YYHtd,0\+
String className,url,uid,pwd; 8[U1{s:J
className = "oracle.jdbc.driver.OracleDriver"; yazC2Enes8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; wQ qI@
uid = "system"; {,tEe'H7
pwd = "manager"; nVV>;e[
Class.forName(className); Iodk1Y;
Connection cn = DriverManager.getConnection(url,uid,pwd); X>j% y7v
2)用jndi(java的命名和目录服务)方式 O emi }
例子 `uy)][j-
String jndi = "jdbc/db"; ulV)X/]1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); xz5 Jli
DataSource ds = (DataSource) ctx.lookup(jndi); .{x-A{l
Connection cn = ds.getConnection(); 9l9nT
多用于jsp中 Ub*Gv(Pg
2、执行sql语句 zE5%l`@|o
1)用Statement来执行sql语句
XeDiiI
String sql; Vu0jNKUV
Statement sm = cn.createStatement(); Ro$'|}(+A
sm.executeQuery(sql); // 执行数据查询语句(select) 4G0Er?D
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~YKe:K+&z
2)用PreparedStatement来执行sql语句 *Hy-D</w%
String sql; tM]~^U
sql = "insert into user (id,name) values (?,?)"; pb1/HhRR^n
PreparedStatement ps = cn.prepareStatement(sql); R)d1]k8
ps.setInt(1,xxx); , j^ /~
ps.setString(2,xxx); m!5P5U
x
... 5v"QKI
ResultSet rs = ps.executeQuery(); // 查询 YU.aZdA&V3
int c = ps.executeUpdate(); // 更新 s~$ZTzV
f/RzE
3、处理执行结果 ^%V'l-}/
查询语句,返回记录集ResultSet lN#W
更新语句,返回数字,表示该更新影响的记录数 \ni?_F(Y
ResultSet的方法 A;n3""
1、next(),将游标往后移动一行,如果成功返回true;否则返回false xGTVC=q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 wgxr8;8`q
Esvr~)Y
4、释放连接 ;<d("Yz:@Z
cn.close(); #L5H-6nz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection R!b<Sg
6gV-u~j [#
可滚动、更新的记录集 Cqy84!Z<
1、创建可滚动、更新的Statement ms8de>A|H
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); NrT!&>M
该Statement取得的ResultSet就是可滚动的 &p=Uus
2、创建PreparedStatement时指定参数 1@sy:{
d`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); T%Xl(.Ft
ResultSet.absolute(9000); _0ki19rs
批量更新 V
@8+
1、Statement 3maiBAOKz
Statement sm = cn.createStatement(); P2pdXNV
sm.addBatch(sql1); i1$ $86
sm.addBatch(sql2); w%R(*,r6
... J7q^4M+o:
sm.executeBatch() @igr~hJ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /]m5HW(P7K
2、PreparedStatement S0\QZ/je
PreparedStatement ps = cn.preparedStatement(sql); V/"UDof
{ ^.)oQo SE
ps.setXXX(1,xxx); bHRH2Ss
... ,%7>%*nhk
ps.addBatch(); 2 %UzCK
} TeaP\a
ps.executeBatch(); Q.X)QCp#r
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 UIgs/
"1|n]0BF
事务的处理 IHHL. gT
1、关闭Connection的自动提交 ?aOx
b
cn.setAutoCommit(false); >Lj0B%^EvM
2、执行一系列sql语句 =i[ _C>U
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =]jc{Y%o
Statement sm ; 2#LTd{
sm = cn.createStatement(insert into user...); Y!s94#OaZ
sm.executeUpdate(); jWk1FQte
sm.close(); w%F~4|F
sm = cn.createStatement("insert into corp...); <