java 数据库基本操作 w#v8a$tT
1、java数据库操作基本流程 Yh%a7K
2、几个常用的重要技巧: %vPs38Fks
可滚动、更新的记录集 _I;+p eq
批量更新 E|u#W3-:
事务处理 ~GL"s6C$`;
esCm`?qCP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;lqtw]4v
1、取得数据库连接 V=";vRS8
1)用DriverManager取数据库连接 ?2ZggV
例子 I>k>^
String className,url,uid,pwd; ^WDAW#f*<
className = "oracle.jdbc.driver.OracleDriver"; )+]8T6~
N
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; q$vATT
uid = "system"; cP[3p:
pwd = "manager"; *2O4 *Q1
Class.forName(className); F.P4c:GD
Connection cn = DriverManager.getConnection(url,uid,pwd); 4_3O?IY
2)用jndi(java的命名和目录服务)方式 /]=dPb%
例子 x <^vJ1
String jndi = "jdbc/db"; iV X 12
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ,#G>&
DataSource ds = (DataSource) ctx.lookup(jndi); K-Bf=7F,
Connection cn = ds.getConnection(); J(*QtF
多用于jsp中 vJ*IUy
2、执行sql语句 !,}W|(P)
1)用Statement来执行sql语句 Ux_ tHyc/
String sql; T(@y#09
Statement sm = cn.createStatement(); y74Ph:^k
sm.executeQuery(sql); // 执行数据查询语句(select) =ogzq.+|
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); .k5
TQt
2)用PreparedStatement来执行sql语句 }V.Wp6"S
String sql; et|P5%G
sql = "insert into user (id,name) values (?,?)"; =j[zMO
PreparedStatement ps = cn.prepareStatement(sql); i_OoR"J%
ps.setInt(1,xxx); fm2,Mx6
ps.setString(2,xxx); %1Gat6V<'
... wN,DTmtD
ResultSet rs = ps.executeQuery(); // 查询 a\an
int c = ps.executeUpdate(); // 更新 ..yuEA
&Mz3CC6
3、处理执行结果 I(fq4$
查询语句,返回记录集ResultSet 41luFtE9
更新语句,返回数字,表示该更新影响的记录数 @DgJxY|
ResultSet的方法 6Q]c]cCu
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [; M31b3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 [u[`!L=
nenYP0
4、释放连接 2`(-l{3
cn.close(); q1j<p)(
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection tjZ.p.IlG
%)[m bb
可滚动、更新的记录集 %MyA;{-F6
1、创建可滚动、更新的Statement c-z2[a8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 82Fq}N
<
该Statement取得的ResultSet就是可滚动的 K
@3 yS8F
2、创建PreparedStatement时指定参数 1aKYxjYM
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); *<*{gO?Q4
ResultSet.absolute(9000); 0'!v-`.
批量更新 8[LwG&
1、Statement ;+]9KIa_Pq
Statement sm = cn.createStatement(); Dt,b\6
sm.addBatch(sql1); 0;z-I"N
sm.addBatch(sql2); yoTbIQ
... *_d+c G
sm.executeBatch() WjZJQK
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 e:H7ht:
2、PreparedStatement gd'#K~?
PreparedStatement ps = cn.preparedStatement(sql); BCB"&:}
{ wH1E7LY|R
ps.setXXX(1,xxx); `<ITLT
... J<x?bIetj
ps.addBatch(); U,"lOG'
} i:`ur
ps.executeBatch(); $Z)Dvy|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 XQ.czj
8cn)ox|J[
事务的处理 .+3= H@8h
1、关闭Connection的自动提交 [\CQ_qs|
cn.setAutoCommit(false); Ms5m.lX
2、执行一系列sql语句 `Z]Tp1U
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close FUzIuz 6
Statement sm ; &fA`Od6l"
sm = cn.createStatement(insert into user...); Lv@JfN"O
sm.executeUpdate(); F/9]{H
sm.close(); b_Ns
Ch3@
sm = cn.createStatement("insert into corp...); <apsG7(7
sm.executeUpdate(); 8[i#x|`g
sm.close(); f !t2a//
3、提交 ty]JUvR@
cn.commit(); \Ku=a{Ne
4、如果发生异常,那么回滚 bHcb+TR3
cn.rollback();