java 数据库基本操作 7Nd*,DV_
1、java数据库操作基本流程 p}96uaC1
2、几个常用的重要技巧: (%6(5,
可滚动、更新的记录集 Z@;jIH4 (
批量更新 2]2{&b u
事务处理 *Ao2j;
t3pZjdLJd
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 HE*7\"9
1、取得数据库连接 (QhGxuC
1)用DriverManager取数据库连接
.V8/ELr]
例子 ;gEp!R8
String className,url,uid,pwd; 7t ZW^dF
className = "oracle.jdbc.driver.OracleDriver"; %)BwE
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (W7;}g ysh
uid = "system"; i5.?g <.H
pwd = "manager"; eVZa6la"
Class.forName(className); A<mj8qz
Connection cn = DriverManager.getConnection(url,uid,pwd); o`b$^hv{A
2)用jndi(java的命名和目录服务)方式 Hde]DK,d
例子 Po'-z<}wS
String jndi = "jdbc/db"; +ylxezc
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); xOwNCh
DataSource ds = (DataSource) ctx.lookup(jndi); P/C&R-{')
Connection cn = ds.getConnection(); S&5Q~}{,
多用于jsp中 mfu*o0
2、执行sql语句 c!tvG*{
1)用Statement来执行sql语句 gTqeJWX9wP
String sql; N-XVRuv
Statement sm = cn.createStatement(); ".Lhte R?
sm.executeQuery(sql); // 执行数据查询语句(select) ay=KfY5
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); g Cg4;b6g
2)用PreparedStatement来执行sql语句 @YEw^J~
String sql; rn5"o8|
sql = "insert into user (id,name) values (?,?)"; : :F!
PreparedStatement ps = cn.prepareStatement(sql); 8$2l^
ps.setInt(1,xxx); "|(rVj=
ps.setString(2,xxx); aUKh})B
... UedvA9$&;
ResultSet rs = ps.executeQuery(); // 查询 7bA4P*
int c = ps.executeUpdate(); // 更新 <Gn8B^~$
4kWg>F3
3、处理执行结果 ]|Ow_z8
O
查询语句,返回记录集ResultSet ;[FW!
更新语句,返回数字,表示该更新影响的记录数 KYnW7|*
ResultSet的方法 Sg/:n,68
1、next(),将游标往后移动一行,如果成功返回true;否则返回false !S~,>,yd
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~!8%_J _
_L?v6MTj
4、释放连接 <^CYxy
cn.close(); I++W0wa.n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 8FxcI!A@
z0T`5NG@
可滚动、更新的记录集 @PT`CK}
1、创建可滚动、更新的Statement \Pw8wayr%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); "V*kOb&'*Z
该Statement取得的ResultSet就是可滚动的 =#OHxM
2、创建PreparedStatement时指定参数 jz{(q;
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); xP8iz?6"V
ResultSet.absolute(9000);
jz|Wj
批量更新 ybD{4&ZE
1、Statement -s9 Y(>
Statement sm = cn.createStatement(); }s`jl``PM
sm.addBatch(sql1); P3+)pOE-SI
sm.addBatch(sql2); aeG#:
Ln+{
... ML=hKwCA
sm.executeBatch() e*Uz#w:
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 l84h%,
2、PreparedStatement a9yIV5_N
PreparedStatement ps = cn.preparedStatement(sql); ArNur~
{ u3Zzu \{
ps.setXXX(1,xxx); EO4"Z@ji
... E\{^0vNc
ps.addBatch(); Vpug"aR&_
} kV*y_5g
ps.executeBatch(); s,eld@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 >/7KL2*
=?meO0]y
事务的处理 j#*asGdp#J
1、关闭Connection的自动提交 9F2P(aS
cn.setAutoCommit(false); z5x,fQw6O
2、执行一系列sql语句 X@6zI-Y%
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close P`\m9"7
Statement sm ; S/@dkHI'
sm = cn.createStatement(insert into user...); B'G*y2UnG
sm.executeUpdate(); Fy}MXe"f
sm.close(); %k/
k]:s
sm = cn.createStatement("insert into corp...); iYO
wB'z
sm.executeUpdate(); 5en
[)3E
sm.close(); L eG7x7n
3、提交 r[.zLXgK
cn.commit(); ^ 4u3Q
4、如果发生异常,那么回滚 m&Y;/kr
cn.rollback();