java 数据库基本操作 45[,LJaMd
1、java数据库操作基本流程 l4taD!WD/
2、几个常用的重要技巧: 90iveb21}
可滚动、更新的记录集 w;Fy/XQ
批量更新 wexX|B^u
事务处理 >}NnzZ
3w p@OF_
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~rjK*_3/
1、取得数据库连接 D'ZUbAh!
1)用DriverManager取数据库连接 1GkoE
例子 UfO='&U^
String className,url,uid,pwd; 8tjWVo
className = "oracle.jdbc.driver.OracleDriver"; Ho(}_Q&
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; rc>}3?o
uid = "system"; SCMvq?9
pwd = "manager"; o2$A2L9P
Class.forName(className); wi.E$RckD
Connection cn = DriverManager.getConnection(url,uid,pwd); +T*??OW@
2)用jndi(java的命名和目录服务)方式 l]t^MEoc8
例子 e8:O2!HW
String jndi = "jdbc/db"; ^e_uprZWm
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); aA>!p{/x
DataSource ds = (DataSource) ctx.lookup(jndi); =2rdbq6R
Connection cn = ds.getConnection(); T:K}mLSg
多用于jsp中 `\ IaeMvo
2、执行sql语句 -%>Tjo@Bn
1)用Statement来执行sql语句 GeB-4img
String sql; Q
(gA:aQ
Statement sm = cn.createStatement(); &"A:_5AU
sm.executeQuery(sql); // 执行数据查询语句(select) -R];tpddR5
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); fn7?g
2)用PreparedStatement来执行sql语句 Wq 1OYZ,
String sql; ei1;@k/
sql = "insert into user (id,name) values (?,?)"; x+'Ea.^
PreparedStatement ps = cn.prepareStatement(sql); wM;=^br
ps.setInt(1,xxx); q`z1ht
nf
ps.setString(2,xxx); ~K|ha26W
... V}2[chbl
ResultSet rs = ps.executeQuery(); // 查询 Q=[ IO,f
int c = ps.executeUpdate(); // 更新 b rDyjh
MX!N?k#KhP
3、处理执行结果 +Qzl-eN/+
查询语句,返回记录集ResultSet mdmJne.
更新语句,返回数字,表示该更新影响的记录数 $6r>
Tc](
ResultSet的方法 &FZ~n?;hQ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false aDLlL?r3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `@6y Wb:X
<+%y
4、释放连接 ehe#"exCB
cn.close(); [;D1O;c'W.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection { VM^K1
.]<iRf[\[
可滚动、更新的记录集 J=O_nup6C
1、创建可滚动、更新的Statement o:as}7/^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $|!3ks
该Statement取得的ResultSet就是可滚动的 ,CqGO %DY
2、创建PreparedStatement时指定参数
2Mw`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); CA$|3m9)NM
ResultSet.absolute(9000); l[WX77bp=
批量更新 +^rt48${ y
1、Statement L0%W;m
Statement sm = cn.createStatement(); -B7X;{
sm.addBatch(sql1); Rp_ }_hL0
sm.addBatch(sql2); ,K&L/*
... =|^R<#%/
sm.executeBatch() :F"NF
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
VIod6Vk
2、PreparedStatement bQ0+Y?,+/
PreparedStatement ps = cn.preparedStatement(sql); 9r8bSV3`
{ CX5>/
ps.setXXX(1,xxx); ^O"o-3dte
... )g U#[}6H
ps.addBatch(); | NFDrm
} W<~u0AyO
3
ps.executeBatch(); n2'XWbMaL
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 cj#.Oaeq*
rZRTQ
事务的处理 /Hq#!2)
1、关闭Connection的自动提交 P}!pmg6V
cn.setAutoCommit(false); T{'oR .g,
2、执行一系列sql语句 O;(n[k
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "1Y DT-I"
Statement sm ; {q);1Nnf
sm = cn.createStatement(insert into user...); Cv`dK=n>
sm.executeUpdate(); %=vU
Z4
sm.close();
}[;r-5}
sm = cn.createStatement("insert into corp...); [bBPs&7u
sm.executeUpdate(); +xYg<AFS
sm.close(); E@Yq2FBpnn
3、提交 VY!A]S"
cn.commit(); EPEn"{;U
4、如果发生异常,那么回滚 =cx_3gCr{
cn.rollback();