java 数据库基本操作 =!}n .
1、java数据库操作基本流程 I5EKS0MQ!
2、几个常用的重要技巧: 'Cw&9cL9w
可滚动、更新的记录集 b[5$$_[
批量更新 R@*mMWW,
事务处理 Ky"]L~8$
1, 5"sQ$
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }:JE*D|
1、取得数据库连接 CjtBQ5
1)用DriverManager取数据库连接 -+vA9,pI
例子 5f5bhBZ<
String className,url,uid,pwd; Dn{
hU$*
className = "oracle.jdbc.driver.OracleDriver"; )qXl8H I
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ) 0p9I0=
uid = "system"; h SGI
pwd = "manager"; ]O%wZIp\P
Class.forName(className); E=N44[`.G
Connection cn = DriverManager.getConnection(url,uid,pwd); $P<T`3Jg
2)用jndi(java的命名和目录服务)方式 dnRS$$9#
例子 2R}9wDP
String jndi = "jdbc/db"; -+1_ 1!
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 7G,{BBB
DataSource ds = (DataSource) ctx.lookup(jndi); 1Z9_sd~/6
Connection cn = ds.getConnection(); \#1*r'V8
多用于jsp中 ]/byz_7]
2、执行sql语句 >`\f,yql6
1)用Statement来执行sql语句 ahezDDR-.i
String sql; 21(8/F ~{
Statement sm = cn.createStatement(); hC1CISm.U
sm.executeQuery(sql); // 执行数据查询语句(select) zJ-_{GiM*L
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); oWCy%76@
2)用PreparedStatement来执行sql语句 q. zBm@:
String sql; TVaD',5_V%
sql = "insert into user (id,name) values (?,?)"; LJ^n6 m|_
PreparedStatement ps = cn.prepareStatement(sql); kjCXP
ps.setInt(1,xxx); &)(>e}es
ps.setString(2,xxx); 2|="!c8K
... :exgdm;N
ResultSet rs = ps.executeQuery(); // 查询 c?@WNv
int c = ps.executeUpdate(); // 更新 +rT%C&ze
82w;}(!
3、处理执行结果 lr>:S
查询语句,返回记录集ResultSet Xz/5Wis4
更新语句,返回数字,表示该更新影响的记录数 z^@.b
ResultSet的方法 IZr~h9
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [V vTR#^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 7d9kr?3(U
&G#LQl
4、释放连接 3Z,J&d`[
cn.close(); +TA'P$j
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection \BIa:}9O
+w'"N
可滚动、更新的记录集 !_zp'V]?
1、创建可滚动、更新的Statement U)v['5%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); WCa>~dF>
该Statement取得的ResultSet就是可滚动的 /g|H?F0
2、创建PreparedStatement时指定参数 }>)e~\Tdzb
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); _e2=BE`W)
ResultSet.absolute(9000); OR{<)L
批量更新 qG=?+em
1、Statement 977%9z<h
Statement sm = cn.createStatement(); +Ce[OG.
sm.addBatch(sql1); M8 4{u!>[
sm.addBatch(sql2); 1|]IWX|
... Vjv~RNGF
sm.executeBatch() 1_AB;^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
dv?ael^
2、PreparedStatement [73 \jT
PreparedStatement ps = cn.preparedStatement(sql); i=m5M]Ef
{ ,r$k79TI
ps.setXXX(1,xxx); B=0U^wL
... Z%h _g-C
ps.addBatch(); [
" n+2;
} +[LG>
ps.executeBatch(); U;o$=,_p
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 bn$('
z%lu%
事务的处理 'hEvW
1、关闭Connection的自动提交 [r[IWy(}
cn.setAutoCommit(false); .f1
2、执行一系列sql语句 }OQaQf9V{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close U9?fUS
Statement sm ; % oPt],>
sm = cn.createStatement(insert into user...); 3K8#,TK3
sm.executeUpdate(); -?jI{].:8
sm.close(); A*1-2
sm = cn.createStatement("insert into corp...); /G{;?R
sm.executeUpdate(); {B!LhvYAH
sm.close(); H@+1I?l
3、提交 *En29N#a{
cn.commit(); 7H$I9e
4、如果发生异常,那么回滚 [uJfmr EH
cn.rollback();