java 数据库基本操作 1Kf
t?g
1、java数据库操作基本流程 \bl,_{z?
2、几个常用的重要技巧: *rKv`nva5
可滚动、更新的记录集 x<7` 109]
批量更新 U*U)l$!
事务处理 y\|\9Q%D
HPCA$LD
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 RIqxM
1、取得数据库连接 VRP.tD
1)用DriverManager取数据库连接 [gr[0aG Bc
例子 iKH T
String className,url,uid,pwd; Uk ;.Hrt.
className = "oracle.jdbc.driver.OracleDriver"; [a*>@IR
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ]BD5+>;
uid = "system"; ~{$'s p0
pwd = "manager"; aYCzb7
Class.forName(className); 4xn^`xf9
Connection cn = DriverManager.getConnection(url,uid,pwd); a}7KpKCD
2)用jndi(java的命名和目录服务)方式 #UeU:RJ1
例子 A8/4:>Is
String jndi = "jdbc/db"; {QkH%jj
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +~.Jw#HqS
DataSource ds = (DataSource) ctx.lookup(jndi); Tka="eyIj3
Connection cn = ds.getConnection(); mBkQ
8e
多用于jsp中 |Qm%G\oB?
2、执行sql语句 0]0M>vx
u
1)用Statement来执行sql语句 `ViNSr):J
String sql; :>ST)Y@]w
Statement sm = cn.createStatement(); < io8
b|A
sm.executeQuery(sql); // 执行数据查询语句(select) %=
;K>D
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :@A;!'zpL
2)用PreparedStatement来执行sql语句 /[dAgxL
String sql; ?+tZP3'
sql = "insert into user (id,name) values (?,?)"; TmAb!
Y|F
PreparedStatement ps = cn.prepareStatement(sql); TBfl9Q
ps.setInt(1,xxx); k8>^dZub
ps.setString(2,xxx); rGL{g&_
... ^S2}0Nf
ResultSet rs = ps.executeQuery(); // 查询 ?|YQtY
int c = ps.executeUpdate(); // 更新 <$6E r
*0ntx$M-w
3、处理执行结果 ;| ,Y2?
查询语句,返回记录集ResultSet 3H%WB|
更新语句,返回数字,表示该更新影响的记录数 IH:Cm5MV
ResultSet的方法 ${eh52)`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false I;Y`rGj
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 r(CL=[
z{WqICnb
4、释放连接 ToM*tXj
cn.close(); yvwcXNXR@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection o[6"XJ
XYTcG;_z
可滚动、更新的记录集 H hH'\-[t
1、创建可滚动、更新的Statement =B%e0M
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Jl,x~d
该Statement取得的ResultSet就是可滚动的 y^BM*C I
2、创建PreparedStatement时指定参数 ub&29Qte
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); >G7U7R}R
ResultSet.absolute(9000);
S6Pb V}
批量更新 ..mz!:Zs0
1、Statement _J;a[Ky+[
Statement sm = cn.createStatement(); Hf|:A(vCx
sm.addBatch(sql1); w2AWdO6
sm.addBatch(sql2); R;2 -/MT-
... 7Wn]l!
sm.executeBatch() !Ve3:OZ.nO
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %z(=GcWm
2、PreparedStatement X/7 49"23
PreparedStatement ps = cn.preparedStatement(sql); "!?Ya{
{ d_B5@9e#
ps.setXXX(1,xxx); W)O'( D
... 6E4 L4Vb
ps.addBatch(); JwVv+9hh
} th|Q NG
ps.executeBatch(); aX:$Q
}S
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6*
w;xf
_
RT}Ee}Y
事务的处理 nzDY!Y
1、关闭Connection的自动提交 mn` Ae=
cn.setAutoCommit(false); HEN9D/O=
2、执行一系列sql语句 U%l{>*q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .C?g nOq
Statement sm ; I]1fH
sm = cn.createStatement(insert into user...); b7mP~]V
sm.executeUpdate(); &T}e93]
sm.close(); -&tiM
v
sm = cn.createStatement("insert into corp...); =p$ Wo
sm.executeUpdate(); 1t'\!
sm.close(); "rJL ^ \r
3、提交 4ebGAg ?_
cn.commit(); xy>mM"DOH
4、如果发生异常,那么回滚 *%sYajmD
cn.rollback();