java 数据库基本操作 R[QE:#hT
1、java数据库操作基本流程 sp%7iNs
2、几个常用的重要技巧: CJ_B.
可滚动、更新的记录集 Z5Cv$bUc
批量更新 W3b\LnUa
事务处理 ~X/T6(n$
[>E0(S]
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 IWkBq]Y
1、取得数据库连接 })B)-8
1)用DriverManager取数据库连接 ^:BRbp37i
例子 l< Y x
String className,url,uid,pwd; ~$`b{
className = "oracle.jdbc.driver.OracleDriver"; &N EzKf
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; JsV#:
uid = "system"; {q^KlSjm
pwd = "manager"; DQSv'!KFO
Class.forName(className); ee0J;pP2#
Connection cn = DriverManager.getConnection(url,uid,pwd); /bWV`*
2)用jndi(java的命名和目录服务)方式 !E%!,
例子 (<12&=WxE
String jndi = "jdbc/db"; wZ^/-
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [kCn6\_<V
DataSource ds = (DataSource) ctx.lookup(jndi); 2rxdRg'YLQ
Connection cn = ds.getConnection(); x;+,lP
多用于jsp中 (H$eXW7
2、执行sql语句 \ys3&<;b
1)用Statement来执行sql语句 rO
NLbrj
String sql; Hl#o& *Ui"
Statement sm = cn.createStatement(); 3]'3{@{}H
sm.executeQuery(sql); // 执行数据查询语句(select) #r1x0s40D
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); gU`QW_{
2)用PreparedStatement来执行sql语句 9} vWTt0
String sql; `F)Iv:;y,
sql = "insert into user (id,name) values (?,?)"; m2;%|QE(
PreparedStatement ps = cn.prepareStatement(sql); |:\h3M
ps.setInt(1,xxx); z, OMR`W
ps.setString(2,xxx); JOMZ&c^
... zVIzrz0
ResultSet rs = ps.executeQuery(); // 查询 Z5\6ca
int c = ps.executeUpdate(); // 更新 <C&UDj
nJ,56}
3、处理执行结果 Ac|`5'/Tx
查询语句,返回记录集ResultSet v#~,)-D&
更新语句,返回数字,表示该更新影响的记录数 '
|4XyU=
ResultSet的方法 vjHbg#0 %
1、next(),将游标往后移动一行,如果成功返回true;否则返回false pH4i6B*5
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 q+K`+& @\
oR+Fn}mG
4、释放连接 txi
m|)
cn.close(); KT3[{lr
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection `]%{0 Rx
?B-aj
可滚动、更新的记录集 As"'KR
1、创建可滚动、更新的Statement +/ #J]v-
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); cJt#8P
该Statement取得的ResultSet就是可滚动的 rTi.k
2、创建PreparedStatement时指定参数 lB-Njr
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); })J]D~!p
ResultSet.absolute(9000); B$\5=[U
批量更新 9U+^8,5
1、Statement U*-%V$3+w5
Statement sm = cn.createStatement(); DU;]Q:r{
sm.addBatch(sql1); A)qOJ(OEz
sm.addBatch(sql2); ^0r@",
... e@6}?q;
sm.executeBatch() &P\T{d2"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 YXmLd'F^3
2、PreparedStatement f`?|A
PreparedStatement ps = cn.preparedStatement(sql); P?bdjU#_n`
{ 5f1yszd
ps.setXXX(1,xxx); zP5H TEz
... m8FKr/Z-
ps.addBatch(); o}[wu:>yk
} mk[n3oE1
ps.executeBatch(); 77)C`]0(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 $hA[vi\5
.9`.\v6R
事务的处理 0py0zE6,,
1、关闭Connection的自动提交 il:+O08_
cn.setAutoCommit(false); _3)~{dQ+
2、执行一系列sql语句 WhkE&7Gk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +jHL==W&
Statement sm ; U7{,
*
sm = cn.createStatement(insert into user...); >:Rc%ILym
sm.executeUpdate(); b+w|3bQa
sm.close(); #KiRH* giU
sm = cn.createStatement("insert into corp...); ^fRA$t
sm.executeUpdate(); AR&u9Y)I
sm.close(); ]Fa VKC~3
3、提交 GLEGyT?~
cn.commit(); {~Phc 2z
4、如果发生异常,那么回滚 u\6:Txqq
cn.rollback();