java 数据库基本操作 r|l?2 eO~
1、java数据库操作基本流程 gY7sf1\wX
2、几个常用的重要技巧: EK# 11@0%
可滚动、更新的记录集 Phi5;U!
批量更新 QD7KE6KP'
事务处理 4`8s]X
M0$MK>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Pm%xX~H
1、取得数据库连接 /0\g!29l<
1)用DriverManager取数据库连接 ?kR1T0lKkE
例子 3zB'AG3b
String className,url,uid,pwd; WVR/0l&bU
className = "oracle.jdbc.driver.OracleDriver"; a{xJ#_/6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; qy'-'UlIr
uid = "system"; K9zr]7;th
pwd = "manager"; OB.rETg
Class.forName(className); bse`Xfg
Connection cn = DriverManager.getConnection(url,uid,pwd); bD{tsxm[9
2)用jndi(java的命名和目录服务)方式 q0}u%Yz
例子 b>ZAkz)U+
String jndi = "jdbc/db";
V.{HMeE4
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); w1I07 (
DataSource ds = (DataSource) ctx.lookup(jndi); =0?5hxM d
Connection cn = ds.getConnection(); lo!pslqsn
多用于jsp中 [yMSCCswW
2、执行sql语句 KKsVZ~<6u
1)用Statement来执行sql语句 ^N^G?{EV/#
String sql; MiZ<v/L2
Statement sm = cn.createStatement(); ow'G&<0b
sm.executeQuery(sql); // 执行数据查询语句(select) HrE, K\^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); RNc:qV<H
2)用PreparedStatement来执行sql语句 7G+!9^
String sql; S*<J y(:n
sql = "insert into user (id,name) values (?,?)"; ,a&,R*r@&
PreparedStatement ps = cn.prepareStatement(sql); +(=-95qZ
ps.setInt(1,xxx); ZP~H!
ps.setString(2,xxx); VEy]vr}
... =6U5^+|d
ResultSet rs = ps.executeQuery(); // 查询 x1Gx9z9
int c = ps.executeUpdate(); // 更新 XQ=% a5w
dm}1"BU<
3、处理执行结果 Y$>NsgQn6
查询语句,返回记录集ResultSet <-.@,HQ+
更新语句,返回数字,表示该更新影响的记录数 sl-wNIQ
ResultSet的方法 _]@u)$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $ ,K@xq5
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 rG?5z"
w4P;Z-Cd
4、释放连接 I8! .n
cn.close(); /)kJ iV
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ?lkB{-%rQ
@2T8H
可滚动、更新的记录集 }vh
<x6
1、创建可滚动、更新的Statement `V9bd}M%~;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); H<|}pZ
该Statement取得的ResultSet就是可滚动的 (-$5YKm
2、创建PreparedStatement时指定参数 bVz<8b6h'-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +c/!R|h=S
ResultSet.absolute(9000); &wlD`0v
批量更新 G2N0'R"
1、Statement 8SU0q9X.
Statement sm = cn.createStatement(); a+HK
fK
sm.addBatch(sql1); O#k; O*s'
sm.addBatch(sql2); {XIpHr
... *` mxv0w~(
sm.executeBatch() kBqgz|jE%
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Ye]K 74M.
2、PreparedStatement lD0a<L3
PreparedStatement ps = cn.preparedStatement(sql); r^6@Zwox]
{ ?#GTD?3d
ps.setXXX(1,xxx); 9ye!kYF,
... \FfqIc9;
ps.addBatch(); G%k&|
} :xHKbWz6j
ps.executeBatch(); 5/Qu5/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 eyh}O
0rL.~2)V
事务的处理 Lxv;[2XsW)
1、关闭Connection的自动提交 JkN*hm?
cn.setAutoCommit(false); CKHmJ]=
2、执行一系列sql语句 ' Z#_"s#L
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~~|Iw=:
Statement sm ; O[= L#wi
sm = cn.createStatement(insert into user...); 8Tg1 >q<
sm.executeUpdate(); H
~3.F
sm.close(); `D|])^"{
sm = cn.createStatement("insert into corp...); `Kg!aN
sm.executeUpdate(); cz,CL/rno
sm.close(); mxZ+r#|di
3、提交 {96MfhkeBv
cn.commit(); q]yw",muT
4、如果发生异常,那么回滚 !U:&8Le
cn.rollback();