java 数据库基本操作 W:S?_JM
1、java数据库操作基本流程 efXiZ
2、几个常用的重要技巧: }[mLtv%&
可滚动、更新的记录集 YQN@;
批量更新 :c}"a(|
事务处理 d]r?mnN W
#dhce0m
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接
H_vGa!_
1、取得数据库连接 reI4!,x
1)用DriverManager取数据库连接 }-N4D"d4o
例子 5lrjM^E|
String className,url,uid,pwd; wY xk[)&Y
className = "oracle.jdbc.driver.OracleDriver"; kA4bv}
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; h\lyt(.s
uid = "system"; hq*"S-N
pwd = "manager"; U>0~ /o
Class.forName(className); FT[of(g^
Connection cn = DriverManager.getConnection(url,uid,pwd); Ge^(Ag}vE
2)用jndi(java的命名和目录服务)方式 ##5e:<c&[
例子 S(#v<C,hd
String jndi = "jdbc/db"; hEMS
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )z!#8s
DataSource ds = (DataSource) ctx.lookup(jndi); =k\Qx),Ir
Connection cn = ds.getConnection(); vB Vg/
多用于jsp中 ]Wg&r Y0
2、执行sql语句 iT=h}>
1)用Statement来执行sql语句 vWVQ8S.
String sql;
W4&Itj
Statement sm = cn.createStatement(); }ki6(_
sm.executeQuery(sql); // 执行数据查询语句(select) }DFZ9,gQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); #ja6nt8GC
2)用PreparedStatement来执行sql语句 yF@72tK
String sql; Y,M2D
sql = "insert into user (id,name) values (?,?)"; 63HtZ=hO7
PreparedStatement ps = cn.prepareStatement(sql); avy@)iO7
ps.setInt(1,xxx); Rc(E';uc
ps.setString(2,xxx); zn#lFPj12
... bltZQI|
ResultSet rs = ps.executeQuery(); // 查询 Q`!<2i;
int c = ps.executeUpdate(); // 更新 "Tnmn@
6QePrf
3、处理执行结果 cpu|tK.t
查询语句,返回记录集ResultSet xp%LXxj
更新语句,返回数字,表示该更新影响的记录数 qk=OodEMK
ResultSet的方法 g`I$U%a_2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false aC#{@t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 U"OA m}
O2S{*D={
4、释放连接 QRHM#v S
cn.close(); suE#'0K
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection pGP$2
,+!|~1
可滚动、更新的记录集 l
9bg
1、创建可滚动、更新的Statement DAQozhP8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); AH|'{
该Statement取得的ResultSet就是可滚动的 xM13OoU
2、创建PreparedStatement时指定参数 yX1OJg[s,
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); )NnkoCNeE
ResultSet.absolute(9000); 9d8U@=
批量更新 (|sqN8SbA
1、Statement YJ{_%z|U
Statement sm = cn.createStatement(); -)[~%n#X+t
sm.addBatch(sql1); 15ImwQ
sm.addBatch(sql2); <5npVm
... @!::_E+F]
sm.executeBatch() 23'Ac,{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 X;d 1@G
2、PreparedStatement r?}L^bK
PreparedStatement ps = cn.preparedStatement(sql); qhOV>j,d
{
5Eu`1f?
ps.setXXX(1,xxx); <^"0A
... s=1w6ZLD
ps.addBatch(); YQaL)t$0
} $}.#0c8I
ps.executeBatch(); 79Q>t%rD[
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 c1h?aP
85#+_}#
事务的处理 02q*z>:^
1、关闭Connection的自动提交 M3YC@(N% k
cn.setAutoCommit(false); 5mg] su
2、执行一系列sql语句 .2/W.z2
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o_?A^u
Statement sm ; GtkZ%<KF9
sm = cn.createStatement(insert into user...); C[nacAi
sm.executeUpdate(); g42f*~l
sm.close(); 6Lz:J:Q)
sm = cn.createStatement("insert into corp...); HfA@tZ5q|U
sm.executeUpdate(); kRB2J3Nt.
sm.close(); Df0m
3、提交 xB,(!0{`
cn.commit(); }bYk#6KX
4、如果发生异常,那么回滚 Pql;5
~/
cn.rollback();