java 数据库基本操作 2ORWdR.b
1、java数据库操作基本流程 9r\8 !R
2、几个常用的重要技巧: j!m~ :D
可滚动、更新的记录集 wF3mQ_hv:@
批量更新 NjsP"
事务处理 +z("'Cv
P,D >gxl
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *w>
/vu
1、取得数据库连接 BjOrQAO
1)用DriverManager取数据库连接 'HW(RC0dR
例子 e`#Gq0}8
String className,url,uid,pwd; nV"[WngN
className = "oracle.jdbc.driver.OracleDriver";
w&:h^u
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; >\(Ma3S
uid = "system"; p*NC nD*
pwd = "manager"; jwAO{.}T1r
Class.forName(className); gh i!4
Connection cn = DriverManager.getConnection(url,uid,pwd); B:+}^=
2)用jndi(java的命名和目录服务)方式 *% uv7G@%N
例子 MeP U`M--
String jndi = "jdbc/db"; OdwSNG
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &v3r#$Hj[
DataSource ds = (DataSource) ctx.lookup(jndi); 6~$<
Connection cn = ds.getConnection(); ((;9%F:/$
多用于jsp中 --",}%-
2、执行sql语句
CcAsJX~_
1)用Statement来执行sql语句 v+G}n\F
String sql; a[ Txd=b
Statement sm = cn.createStatement(); dA\>z[n=
sm.executeQuery(sql); // 执行数据查询语句(select) rYN`u
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); k_O"bsI)
2)用PreparedStatement来执行sql语句 j(Q$frI
String sql; ?uQ|?rk
sql = "insert into user (id,name) values (?,?)"; .$v]Bxu
PreparedStatement ps = cn.prepareStatement(sql); :Q$3P+6 a
ps.setInt(1,xxx); ~LYKt0/W&
ps.setString(2,xxx); ) : Q5u6
... a;/4 ht
ResultSet rs = ps.executeQuery(); // 查询 &~||<0m
int c = ps.executeUpdate(); // 更新 >fs-_>1d
Q
7B)t;^
3、处理执行结果 jnH44
查询语句,返回记录集ResultSet EB@!?=0x
更新语句,返回数字,表示该更新影响的记录数 a-i#?hld
ResultSet的方法 4B (*{
1、next(),将游标往后移动一行,如果成功返回true;否则返回false K%Q^2"Eb0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Mt@K01MI%
iVXR=A\er
4、释放连接 WMh'<'wN_
cn.close(); -b)p6>G-C
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >+,1@R
_%i|*
可滚动、更新的记录集 ufEt"P-X.
1、创建可滚动、更新的Statement ']+H P9i$
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ?ADk`ts~,}
该Statement取得的ResultSet就是可滚动的 1T}|c;fc
2、创建PreparedStatement时指定参数 +".&A#wU
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Qyd3e O_
ResultSet.absolute(9000); 4_r8ynq{z
批量更新 f()^^ +
1、Statement vbwEX 6
Statement sm = cn.createStatement(); =7Tbu'O;
sm.addBatch(sql1); dVe3h.,[v
sm.addBatch(sql2); U@Aq@d+n
... +zL=UEBN
sm.executeBatch() X<-]./
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 u!L8Sv
2、PreparedStatement PO)5L
PreparedStatement ps = cn.preparedStatement(sql); `yuD/-j
{ DB?_E{y]
ps.setXXX(1,xxx); <JZ=K5
... L=HL1Qe$G]
ps.addBatch(); C .YtjLQP$
}
]
mP-HFl
ps.executeBatch(); Q&M(wnl5
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /0SPRf}p
YWq[)F@0G
事务的处理 `4;<\VYCr
1、关闭Connection的自动提交 :nZ*x=aq
cn.setAutoCommit(false); :Q\h'$C
2、执行一系列sql语句 |G%MiYd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close dF1Bo
Statement sm ; OQ!mL3f
sm = cn.createStatement(insert into user...); 3UrqV`x \
sm.executeUpdate(); *'exvY~
sm.close(); -P'>~W,~
sm = cn.createStatement("insert into corp...); 39~fP)
sm.executeUpdate(); q &jW{
sm.close(); tQ2*kE
3、提交 6{+~B2Ef
cn.commit(); =797;|B H
4、如果发生异常,那么回滚 ;?n*w+6<
cn.rollback();