java 数据库基本操作 ^ex\S8j
1、java数据库操作基本流程 ERIMz,
2、几个常用的重要技巧: e
}?.3,?
可滚动、更新的记录集 iaEQF]*cC
批量更新 ed#fDMXGQ%
事务处理 A2:}bb~H
mu@ J$\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 O_a^|ln&
1、取得数据库连接 ;J,(YNI
1
1)用DriverManager取数据库连接 [UZr|F
例子 rf%lhBv
String className,url,uid,pwd; ]&]DFY~n
className = "oracle.jdbc.driver.OracleDriver"; C'|9nK$%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; wV==sV
uid = "system"; C&H'?0Y@
pwd = "manager"; aMhVO(+FW
Class.forName(className); k%cE8c}R;A
Connection cn = DriverManager.getConnection(url,uid,pwd); .cQO?UKK
2)用jndi(java的命名和目录服务)方式 Wy7w zt
例子 G/Sp/I<d
String jndi = "jdbc/db"; n]'
r3
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); v;o1c44;
DataSource ds = (DataSource) ctx.lookup(jndi); k Alxm{
Connection cn = ds.getConnection(); }rfikm
多用于jsp中 (vZ-0Ep}
2、执行sql语句 m
=b7
r
1)用Statement来执行sql语句 Uc {m##!
String sql; 8R3{YJ6@T
Statement sm = cn.createStatement(); sV
a0eGc
sm.executeQuery(sql); // 执行数据查询语句(select) \Dq'~
d
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); rN}8~j
2)用PreparedStatement来执行sql语句 bc'IoD/
String sql; 2 wY|E<E
sql = "insert into user (id,name) values (?,?)"; ,.QJS6Yv
PreparedStatement ps = cn.prepareStatement(sql); ^_Hf}8H7]
ps.setInt(1,xxx); G5/A{1sz&
ps.setString(2,xxx); GT<oYrjU
... `_OrBu[
ResultSet rs = ps.executeQuery(); // 查询 ^BA%]pe$I
int c = ps.executeUpdate(); // 更新 "x=\mA#`
J@I>m N1\
3、处理执行结果 mYgfGPF`
查询语句,返回记录集ResultSet :IS?si5|
更新语句,返回数字,表示该更新影响的记录数 p lnH
ResultSet的方法 +mVAmG@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~?ezd0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )xV37]
PO"lY'W.U
4、释放连接 'l.tV7
cn.close(); )dhR&@r*w
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection w!20
49QsT5b)
可滚动、更新的记录集 WDIin6u-
1、创建可滚动、更新的Statement *{w0=J[15
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); M<w.q|P
该Statement取得的ResultSet就是可滚动的 kPs?
2、创建PreparedStatement时指定参数 KM?4J6jH
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /#Aw7F$Ey
ResultSet.absolute(9000); a(A~S u97
批量更新 /\/^= j
1、Statement QLO;D)fC
Statement sm = cn.createStatement(); NLMvi!5w,
sm.addBatch(sql1); FFcCoPX_
sm.addBatch(sql2); Z2$_9.
... 5 qfvHQ ~M
sm.executeBatch() imYfRi=$
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ;b0Q%TDh
2、PreparedStatement U~:H>
PreparedStatement ps = cn.preparedStatement(sql); k=mQG~
{ F0U %m
ps.setXXX(1,xxx); }MRgNr'k
... 0#J~@1Gf
ps.addBatch(); _
l`F}v
} OX;(Mg|
ps.executeBatch(); 4@-tT;$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rc8HZ
k-|g
事务的处理 OOSf<I*>
1、关闭Connection的自动提交 gS+X%
cn.setAutoCommit(false); M#'7hm6
2、执行一系列sql语句 &IUA[{o~e
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~][~aEat;V
Statement sm ; AhF@
sm = cn.createStatement(insert into user...); /(BS<A
sm.executeUpdate(); 3$!QP
N
sm.close(); <=7nTcO~
sm = cn.createStatement("insert into corp...); TRi#
sm.executeUpdate(); 6m;>R%S_
sm.close(); kS-BB[T
3、提交 I_ZJnu<
cn.commit(); w"9h_;'C_
4、如果发生异常,那么回滚 :b44LXKCP
cn.rollback();