java 数据库基本操作 ^oR
qu
1、java数据库操作基本流程 q2s=>J';
2、几个常用的重要技巧: +No` 89Y
可滚动、更新的记录集 {^k7}`7,
批量更新 Gd$!xN%O
事务处理 /x<uv_"
WJk3*$=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接
WJ,? 5#
1、取得数据库连接 <
<F
1)用DriverManager取数据库连接 p_vldTIW
例子 >">Xd@Wk
String className,url,uid,pwd; d[Zx [=h
className = "oracle.jdbc.driver.OracleDriver"; f4VdH#eng`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (}s& 84!
uid = "system"; @$nh6l>i
pwd = "manager"; z]D/Qr
Class.forName(className); ZQn>+c2%!
Connection cn = DriverManager.getConnection(url,uid,pwd); BAi`{?z$<
2)用jndi(java的命名和目录服务)方式 FAX[|p
例子 8_pyfb
String jndi = "jdbc/db"; nJ$2RN
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ].sD#~L_
DataSource ds = (DataSource) ctx.lookup(jndi); C-g,uARX(r
Connection cn = ds.getConnection(); Z<QNzJ D
多用于jsp中 wPq9`9 #
2、执行sql语句 .hUlI3z9
1)用Statement来执行sql语句 pE%*r@p4&4
String sql; %:j`%F;R
Statement sm = cn.createStatement(); EMpq+LrN
sm.executeQuery(sql); // 执行数据查询语句(select) 9W,%[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); j&
ykce
2)用PreparedStatement来执行sql语句 h!Y##_&&4
String sql; 3i\Np =
sql = "insert into user (id,name) values (?,?)"; |kD69
}sG
PreparedStatement ps = cn.prepareStatement(sql); |nm}E_
ps.setInt(1,xxx); (xKypc+j
ps.setString(2,xxx); %V#MUi1
... CHq5KB98+
ResultSet rs = ps.executeQuery(); // 查询 s3 fQGbU
int c = ps.executeUpdate(); // 更新 YT,yRV9#
N1$PW~)Y
3、处理执行结果 1K(mdL{m5
查询语句,返回记录集ResultSet PF#<CF$ =
更新语句,返回数字,表示该更新影响的记录数 P1)87P
ResultSet的方法 `P <#kt
1、next(),将游标往后移动一行,如果成功返回true;否则返回false IusZY B
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :*^aSPlV
A%x0'?GU
4、释放连接 FHEP/T\5
cn.close(); #f%fY%5q
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection mwsdl^c
apt$e$g
可滚动、更新的记录集 :X:s'I4J
D
1、创建可滚动、更新的Statement K;w2qc.+
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); r^H,H'BohJ
该Statement取得的ResultSet就是可滚动的 /^v!B`A@
2、创建PreparedStatement时指定参数 9JX@ck
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {:3:GdM6
ResultSet.absolute(9000); 1hSV/%v_
批量更新 Z>3m-:-e
1、Statement VMe
Statement sm = cn.createStatement(); 5g
O9 <
sm.addBatch(sql1); ^Wn+G8n
sm.addBatch(sql2); jatlv/,
... #)@#Qd
sm.executeBatch() e\^}PU
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 G!wb|-4<$
2、PreparedStatement 0-;>O|U3
PreparedStatement ps = cn.preparedStatement(sql); =vvd)og
{ lrL:G[rt
ps.setXXX(1,xxx); (h=]Ox
... /W .G-|:
ps.addBatch(); 5#s],h
} Ab>Kf r#
ps.executeBatch(); ]mz '(t
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 (h@!_qi9:
/y|ZAN
事务的处理 2`j{n\/
1、关闭Connection的自动提交 A{M7
cn.setAutoCommit(false); (y~%6o6
2、执行一系列sql语句 :U=3*f.{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close `'>~(8&zE
Statement sm ; R
eb.x_
sm = cn.createStatement(insert into user...); Q1ayd$W@<
sm.executeUpdate(); <mj/P|P@
sm.close(); }q'IY:r
sm = cn.createStatement("insert into corp...); U OGjil{.
sm.executeUpdate(); t\'MB
sm.close(); [@JK|50|K
3、提交 pKGhNIj$
cn.commit(); O[{/P:a
4、如果发生异常,那么回滚 x*RSD,3
cn.rollback();