java 数据库基本操作 a{HgIQg_>R
1、java数据库操作基本流程 H}V*<mgw
2、几个常用的重要技巧: W 'a~pB1I
可滚动、更新的记录集 4sBoD=e
批量更新 5?L:8kHsH
事务处理 j!MA]0lTM
6r=)V$K<
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %]0U60
1、取得数据库连接 #}7m'F
1)用DriverManager取数据库连接 HQ`nq~%&(
例子 +Z&&H'xD
String className,url,uid,pwd; z%3"d0
className = "oracle.jdbc.driver.OracleDriver";
Jf<yTAm
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; q>(u>z!
uid = "system"; oHXW])[
pwd = "manager"; UUf1T@-
Class.forName(className); aE+$&_>ef
Connection cn = DriverManager.getConnection(url,uid,pwd); .cS,T<$
2)用jndi(java的命名和目录服务)方式 0aTbzOn&
例子 Cn;H@!8<s
String jndi = "jdbc/db"; 7]xz8t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); qm8n7Z/
DataSource ds = (DataSource) ctx.lookup(jndi); ~oA9+mT5
Connection cn = ds.getConnection(); m2uML*&O5K
多用于jsp中 &9dr+o-(~
2、执行sql语句 y2"S\%7$h
1)用Statement来执行sql语句 z!C4>,
String sql; *<1x:PR
Statement sm = cn.createStatement(); `V):V4!j),
sm.executeQuery(sql); // 执行数据查询语句(select) uxMy1oy
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); RrU~"P1C
2)用PreparedStatement来执行sql语句 uM)9b*Vbo
String sql; ;=VK_3"
sql = "insert into user (id,name) values (?,?)"; a^\- }4yR
PreparedStatement ps = cn.prepareStatement(sql); @~#79B"9&
ps.setInt(1,xxx); e4YfTr
ps.setString(2,xxx); 0SCW2/o8
... PP[)h,ZL*
ResultSet rs = ps.executeQuery(); // 查询 2}`V c{\
int c = ps.executeUpdate(); // 更新 ?sf2h:\N
y)^CDe2xU
3、处理执行结果 S5E,f?l
查询语句,返回记录集ResultSet XJlDiBs9=Q
更新语句,返回数字,表示该更新影响的记录数 b!5tFX;J
ResultSet的方法 X:SzkkVl7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false gc2|V6(
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 o eJC
$,&gAU
4、释放连接 "Eok;io
cn.close(); 8~s-t
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *4hOCQ[
z)W#&JFF
可滚动、更新的记录集 d%_78nOh"
1、创建可滚动、更新的Statement z@%/r~?|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 34m' ]n
该Statement取得的ResultSet就是可滚动的 g"Q}h
2、创建PreparedStatement时指定参数 APQQ:'>N4~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {b-0_
ResultSet.absolute(9000); :L [YmZ
批量更新 Jp.3KA>
1、Statement m.HX2(&\3
Statement sm = cn.createStatement(); J]|6l/i
sm.addBatch(sql1); EN-8uY.
sm.addBatch(sql2); fUp|3bBE
... @ yg|OA}
sm.executeBatch() VM<oUKh_3
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 RP`GG+K
2、PreparedStatement n&YW".iG
PreparedStatement ps = cn.preparedStatement(sql); hk7(2j7B
{ y?Hj%,
ps.setXXX(1,xxx); _Qm7x>NT4
... hyk|+z`B
ps.addBatch(); 'XP>} m
} +B`'P9Zk@
ps.executeBatch(); z,}c?BP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 EDq$vB
tyn?o
事务的处理 qL%.5OCn(
1、关闭Connection的自动提交 c#\ah}]Vo
cn.setAutoCommit(false); oRT
2、执行一系列sql语句 X ]pR,\B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close )8x:x7?
Statement sm ; .y %pGi
sm = cn.createStatement(insert into user...); XQ0#0<
sm.executeUpdate(); u5cVz_S
sm.close(); To# E@Nw
sm = cn.createStatement("insert into corp...); LY\ddI*s
sm.executeUpdate(); KlVi4.]
sm.close(); ;B|^2i1Wi
3、提交 #uD)0zdw
cn.commit(); e9z$+h
4、如果发生异常,那么回滚 G!!-+n<
cn.rollback();