java 数据库基本操作 jTHgh>n
1、java数据库操作基本流程 .! 'SG6 q
2、几个常用的重要技巧: 3&`LVhx
可滚动、更新的记录集 VCf/EkC
批量更新 1xBgb/+
事务处理 `|=hl~
rD_\NgVAs
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Iy[TEB
1、取得数据库连接
@'IRh9
1)用DriverManager取数据库连接 ,9~=yC
例子 %7}ibz4iF
String className,url,uid,pwd; ^L4"X~eM
className = "oracle.jdbc.driver.OracleDriver"; j; TXZ`|(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; yX7P5c.
uid = "system"; 6> DmcG:.
pwd = "manager"; w#qE#g %1
Class.forName(className); ^K3Bn
Connection cn = DriverManager.getConnection(url,uid,pwd); ka=EOiX.
2)用jndi(java的命名和目录服务)方式 0Ba*"/U]t~
例子 &)
qs0
String jndi = "jdbc/db"; \0fS;Q^{j
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [%LIW%t|
DataSource ds = (DataSource) ctx.lookup(jndi); OrPi ("/
Connection cn = ds.getConnection(); Ht4A
多用于jsp中 9 `+RmX;m
2、执行sql语句 Ci9]#)"c
1)用Statement来执行sql语句 &RB{0Qhx
String sql; Bcl6n@{2f
Statement sm = cn.createStatement(); !-AK@`i.
sm.executeQuery(sql); // 执行数据查询语句(select) O=
84ZP%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); G0h/]%I
2)用PreparedStatement来执行sql语句 \%/Y(YVm
String sql; +wIv|zj9
sql = "insert into user (id,name) values (?,?)"; LS%;ZKJ
PreparedStatement ps = cn.prepareStatement(sql); K#;EjR4H
ps.setInt(1,xxx); XMlcY;W
ps.setString(2,xxx); S; Fj9\2)I
... ?s]+2Tq
ResultSet rs = ps.executeQuery(); // 查询 Jp 7m$D%
int c = ps.executeUpdate(); // 更新 wA< Fw
)
_z6 " C8W
3、处理执行结果 kO}QOL4
查询语句,返回记录集ResultSet }. t8Cy9G
更新语句,返回数字,表示该更新影响的记录数 \5DOp-2
ResultSet的方法 ZTzh[2u*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ]I:h4hgw
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
WfH4*e
\O=t5yS
4、释放连接 I*4g ;1x
cn.close(); ?4sF:Y+\
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
%Z-B{I(
}J+\o~
可滚动、更新的记录集 -F&*>?I
1、创建可滚动、更新的Statement D<J,3(Yu
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); VRA0p[
该Statement取得的ResultSet就是可滚动的 cr>"LAi
2、创建PreparedStatement时指定参数 ;%mYsQ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); bCmlSu
ResultSet.absolute(9000); :<PwG]LO
批量更新 l'FNp
1、Statement ((
{4)5}
Statement sm = cn.createStatement(); )uazB!X
sm.addBatch(sql1); )^]1j$N=3
sm.addBatch(sql2); 8dCa@r&tz
... kpx2e2C|
sm.executeBatch() cIOM}/gqv
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Rd:wMy$
2、PreparedStatement L@x#:s=
PreparedStatement ps = cn.preparedStatement(sql); &pN/+,0E
{ dS)c~:&+
ps.setXXX(1,xxx); K!qV82b='{
... !~QmY,R
ps.addBatch(); hx:"'m5
} 't#E-+o
ps.executeBatch(); k*k 9hv?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 TKrh3
D)GD9MJ
事务的处理 -iySU 6
1、关闭Connection的自动提交 $zD}hO9
cn.setAutoCommit(false); I3" GGp3L
2、执行一系列sql语句 tish%Qnpd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |P`: NAf2
Statement sm ; dZ{yNh.]
sm = cn.createStatement(insert into user...); ,+o*>fD
sm.executeUpdate(); >*e,+ok
sm.close(); -Ou@T#h"
sm = cn.createStatement("insert into corp...); 3ox
0-+_
sm.executeUpdate(); s* UO!bH a
sm.close(); 1%k$9[!l%
3、提交 ? yek\X
cn.commit(); [fl^1!3{
4、如果发生异常,那么回滚 ;6/dFOZn
cn.rollback();