java 数据库基本操作 zf!\wY"`
1、java数据库操作基本流程 Lh9>8@ jf
2、几个常用的重要技巧: o._#=7|(
可滚动、更新的记录集 DHu jpZXQ
批量更新 nLN6@
事务处理 p6eDd"Y
dW=D]
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 5KPPZmO
1、取得数据库连接 ;(iUY/ h[h
1)用DriverManager取数据库连接 ^$s~qQQ}B
例子 Iz$W3#hi
String className,url,uid,pwd; 51(`wo>LS
className = "oracle.jdbc.driver.OracleDriver"; B6!<@*BI
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; IkXKt8`YVA
uid = "system"; |EEz>ci
pwd = "manager"; F*jjcUk
Class.forName(className); '>WuukC
Connection cn = DriverManager.getConnection(url,uid,pwd); YvP"W/5
2)用jndi(java的命名和目录服务)方式 Qmc;s{-r;
例子 .Mft+,"
String jndi = "jdbc/db"; X=c
,`&^
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); m=y,_Pz>U
DataSource ds = (DataSource) ctx.lookup(jndi); z1KC$~{O
Connection cn = ds.getConnection(); $^+KR]\q
多用于jsp中 z?) RF[
2、执行sql语句 v.^
'x
1)用Statement来执行sql语句 $X\`
7`v
String sql; 63dtO{:4
Statement sm = cn.createStatement(); #?|1~HC
sm.executeQuery(sql); // 执行数据查询语句(select) @aPu}Hi
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2Q_{2(nQb
2)用PreparedStatement来执行sql语句 !m O] zn
String sql; ][K8\
sql = "insert into user (id,name) values (?,?)"; MUt^mu$86
PreparedStatement ps = cn.prepareStatement(sql); VEYKrZA
ps.setInt(1,xxx); 6%hEs6-R
ps.setString(2,xxx); [,?A$Z*Z|
... QO`Sn N}
ResultSet rs = ps.executeQuery(); // 查询 K}*p(1$u
int c = ps.executeUpdate(); // 更新 mM^8YL
T+`GOFx
3、处理执行结果 O}iKPY8K
查询语句,返回记录集ResultSet H=SMDj)s+
更新语句,返回数字,表示该更新影响的记录数 :x5o3xE
ResultSet的方法 wTuRo
J
1、next(),将游标往后移动一行,如果成功返回true;否则返回false bFdg'_
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 d~bH!P
snzH}$Ls
4、释放连接 WMz|FFKVY
cn.close(); Sw9mrhzJfe
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection G;#t6bk
DdZ_2B2
可滚动、更新的记录集 `YU:kj<6
1、创建可滚动、更新的Statement \7w85$
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); nsw8[pk
该Statement取得的ResultSet就是可滚动的 i2R]lE8
2、创建PreparedStatement时指定参数 UU~;B
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); D@1^:'$V
ResultSet.absolute(9000); H.G^!0j;
批量更新 D'hr\C^
1、Statement z8[|LF-dx
Statement sm = cn.createStatement(); +q?0A^C>
sm.addBatch(sql1); P##( V!YR
sm.addBatch(sql2); 2o3k=hKS
... ~ilBw:L-3
sm.executeBatch() ^|12~d_.T
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Y%cA2V\#m
2、PreparedStatement qf&{O:,Z
PreparedStatement ps = cn.preparedStatement(sql); 8[P6c;\
{ 8i$`oMv[y
ps.setXXX(1,xxx); #:5g`Ch4,
... ~5qZs"ks
ps.addBatch(); Jy[8,X
} aZ0iwMK
ps.executeBatch(); E6\~/=X=%
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 D7'0o`|
Y `p&*O
事务的处理 ]Lft^,7
1、关闭Connection的自动提交 y/*Tvb #TJ
cn.setAutoCommit(false); 3T^dgWXEG
2、执行一系列sql语句 t-m,~Io W
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close i]WlMC6
Statement sm ; Jy
NY *
sm = cn.createStatement(insert into user...); oa|*-nw
sm.executeUpdate(); weadY,-H8
sm.close(); _@?Jx/`;bk
sm = cn.createStatement("insert into corp...); `5jB|r/
sm.executeUpdate(); nk.Eq[08
sm.close(); qCT\rZU
3、提交 *J5euA5=
cn.commit(); WC; a
4、如果发生异常,那么回滚 jmVy4* P_
cn.rollback();