java 数据库基本操作 fOME&$=O
1、java数据库操作基本流程 SM2N3"\
2、几个常用的重要技巧: }p?67y/
可滚动、更新的记录集 qvK/}
批量更新 <;O^3_'
事务处理 (DS"*4ty
SbzJeaZv
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 kFC*,
1、取得数据库连接 nc\2A>f`
1)用DriverManager取数据库连接 5Pxx)F9]
例子 .Eb]}8/}E
String className,url,uid,pwd; oif|X7H;
className = "oracle.jdbc.driver.OracleDriver"; 4*Gv0#dga
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 41s\^'^&
uid = "system"; j"aY\cLr t
pwd = "manager"; T93st<F=R
Class.forName(className); &[_@f#
Connection cn = DriverManager.getConnection(url,uid,pwd); C/#pK2xY
2)用jndi(java的命名和目录服务)方式 'Cz*p,
例子 \7>*ULP
String jndi = "jdbc/db"; S' kgpF"bm
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); tf|;'Nc6
DataSource ds = (DataSource) ctx.lookup(jndi); t|hc`|
Connection cn = ds.getConnection(); i3Bpim.
多用于jsp中 a]xGzv5
2、执行sql语句 URg;e M#
1)用Statement来执行sql语句 :#35mBe}k
String sql; &;)B
qqXc
Statement sm = cn.createStatement(); K~I?i/P=z
sm.executeQuery(sql); // 执行数据查询语句(select) dr+(C[=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); `j9\]50Z>
2)用PreparedStatement来执行sql语句 Xt$P!~Lu
String sql; R=&-nC5e
sql = "insert into user (id,name) values (?,?)"; 8iOHav4
PreparedStatement ps = cn.prepareStatement(sql); Y:L[Iz95o
ps.setInt(1,xxx); ]8DTk!
ps.setString(2,xxx);
s2wDJ|
... F:q8.^HTJ
ResultSet rs = ps.executeQuery(); // 查询 DR:DXJc
int c = ps.executeUpdate(); // 更新 BRskxyL&,
aq8./^
3、处理执行结果 UnP<`z#
查询语句,返回记录集ResultSet D,[Nn_N
更新语句,返回数字,表示该更新影响的记录数 ]'M B3@T
ResultSet的方法 G
&NK
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ZfH>UHft
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8ih_S2Cd
nqo1+OR
4、释放连接 :KA)4[#;W
cn.close(); O(!;7v}
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection h6^|f%\w*i
cL~WDW/
可滚动、更新的记录集 -,T!/E
1、创建可滚动、更新的Statement T*PEUq
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); T!B\ixt6
该Statement取得的ResultSet就是可滚动的 kWVk^,
2、创建PreparedStatement时指定参数 EU%v
|]
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); cz/cY:o)
ResultSet.absolute(9000); lS7L|
批量更新 cNxxX!P/
1、Statement 4%w<Ekd
Statement sm = cn.createStatement(); bv'>4a
sm.addBatch(sql1); J -Lynvqm
sm.addBatch(sql2); 6$=>ck P
... OuEcoI K
sm.executeBatch() ]@<VLP?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 KYJP`va6k
2、PreparedStatement + xO3<u
PreparedStatement ps = cn.preparedStatement(sql); w0oTV;yh
{ =b>TF B=*N
ps.setXXX(1,xxx); qHdUnW
... PpBptsb^|J
ps.addBatch(); KV|D]}
} : [328X2
ps.executeBatch(); ;-@: }/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 fpf,gb8[$n
5 QuRwu_
事务的处理 +y8Y@e}>
1、关闭Connection的自动提交 G'#u!<(^h
cn.setAutoCommit(false); fRLA;1va
2、执行一系列sql语句 =xRD
%Z
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close l!Xj UnRF
Statement sm ; +~aIT=i3
sm = cn.createStatement(insert into user...); f^lcw
sm.executeUpdate(); N>"L2E=z$|
sm.close(); Z_4%Oi
sm = cn.createStatement("insert into corp...); buN@O7\
sm.executeUpdate(); wv."
sm.close(); O65`KOPn
3、提交 UhL1Y
NF_
cn.commit(); 9RHDkK{5
4、如果发生异常,那么回滚 ?
,s'UqR
cn.rollback();