java 数据库基本操作 Xp{gh@#dr
1、java数据库操作基本流程 =} vG|
2、几个常用的重要技巧: Vm6^'1CY
可滚动、更新的记录集 B'
:ZX-Q)
批量更新 k"sL.}$
事务处理 nEGku]pCH{
tXp)o>"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Jp=
(Q]ab
1、取得数据库连接 ?v")Z0 ~
1)用DriverManager取数据库连接 aoJ&< vl3
例子 D:F!;n9
String className,url,uid,pwd; yGD0}\!n
className = "oracle.jdbc.driver.OracleDriver"; { j/w3
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; >yWJk9hf
uid = "system"; P{qn@:
pwd = "manager"; Yb6\+}th
Class.forName(className); tP:xx2N_
Connection cn = DriverManager.getConnection(url,uid,pwd); F;_;lRAb
2)用jndi(java的命名和目录服务)方式 QU#/(N(U#T
例子 %2L9kw'
String jndi = "jdbc/db"; m#S ZI}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4B> l|%
DataSource ds = (DataSource) ctx.lookup(jndi); .9ROa#7U;n
Connection cn = ds.getConnection(); G6J3F
多用于jsp中 ?_^9e
2、执行sql语句 2xnOWW
1)用Statement来执行sql语句 UG!&n@R
String sql; P;y/`_jo
Statement sm = cn.createStatement(); ' 5Ieqpm9
sm.executeQuery(sql); // 执行数据查询语句(select) Z6*RIdD>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); u(o @_6
2)用PreparedStatement来执行sql语句 2
43DdIG$
String sql; pE`(kD
sql = "insert into user (id,name) values (?,?)"; vIG,!^*3
PreparedStatement ps = cn.prepareStatement(sql); .DX#:?@4@Y
ps.setInt(1,xxx); y~d W=zO
ps.setString(2,xxx); l9jcoVo.
... ^ID%pd
ResultSet rs = ps.executeQuery(); // 查询 YW'Y=*
int c = ps.executeUpdate(); // 更新 TcIUo!:z
K)14v;@
3、处理执行结果 hlVP_h"z
查询语句,返回记录集ResultSet IX>|bA;
更新语句,返回数字,表示该更新影响的记录数 ?y
'.sQ
ResultSet的方法 af_zZf!0
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
|z4 /4Y@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ysa"f+/
6RF01z|~_
4、释放连接 ENmo^O#,u
cn.close(); e}?t[aK4#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection P``hw=L
d-*9tit
可滚动、更新的记录集 J^XH^`'
1、创建可滚动、更新的Statement hw7_8pAbh
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); T-@pTJ !K9
该Statement取得的ResultSet就是可滚动的 ;klDt|%3j
2、创建PreparedStatement时指定参数 Kzm_AHA)
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2ReulL8j
ResultSet.absolute(9000); d}G?iX;c}
批量更新 z~BB|-kp1
1、Statement w Vof_'F1
Statement sm = cn.createStatement(); [X
I5Bu ~
sm.addBatch(sql1); Cse0!7_T
sm.addBatch(sql2); _ E%[D(
... mSzwx/3"
sm.executeBatch() w iq{Jo#
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 }iC~B}
2、PreparedStatement :@/fy}!
PreparedStatement ps = cn.preparedStatement(sql); pqs)ueu
{ W@G[ gS\T
ps.setXXX(1,xxx); i~,k2*o
... Zu$f[U)X
ps.addBatch(); )FP|}DCxQ
} 0L1P'*LRU
ps.executeBatch();
%pt$S~j
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 4/jY;YN,2
J!H5{7.efN
事务的处理 \w:u&6,0O
1、关闭Connection的自动提交 qYh,No5\;t
cn.setAutoCommit(false); -3V~YhG
2、执行一系列sql语句 i`Yf|^;@2>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close b'OO~>86
Statement sm ; !69^kIi$
sm = cn.createStatement(insert into user...); {,
|"Rpd
sm.executeUpdate(); H>r-|*n
sm.close(); Wf?sJ`.%b
sm = cn.createStatement("insert into corp...); U\[V !1O
sm.executeUpdate(); 4A&e+kz&:R
sm.close(); {$t*Mb0
3、提交 BuYDw*.
cn.commit(); W(8g3
4、如果发生异常,那么回滚 {aL$vgYT1
cn.rollback();