java 数据库基本操作 Jwp7gYZ
1、java数据库操作基本流程 ,[Fb[#Qqb
2、几个常用的重要技巧: l,:F
可滚动、更新的记录集 / xQPTT
批量更新 t5zKW _J7
事务处理 %SI'BJ
4YHY7J
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 f)!Z~t &
1、取得数据库连接 Fi1@MG5$2
1)用DriverManager取数据库连接 zL it
例子 P4?glh q#
String className,url,uid,pwd; ddo#P%sH'
className = "oracle.jdbc.driver.OracleDriver"; 7rA;3?p)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 8Y3I0S
uid = "system"; y]imZ4{/
pwd = "manager"; +RXoi2"-q@
Class.forName(className); Wm|lSisY
Connection cn = DriverManager.getConnection(url,uid,pwd); eFAnFJ][L
2)用jndi(java的命名和目录服务)方式 "j-CZ\]U|
例子 k8Xm n6X
String jndi = "jdbc/db"; 1cGmg1U;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :LTN!jj
DataSource ds = (DataSource) ctx.lookup(jndi); nm+s{
Connection cn = ds.getConnection(); -hV*EPQ/
多用于jsp中 9cgUT@a
2、执行sql语句 zJXplvaL;
1)用Statement来执行sql语句 z=FZiH
String sql; .-=vx r
Statement sm = cn.createStatement(); uMv1O{
sm.executeQuery(sql); // 执行数据查询语句(select) *kVV+H<X|b
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); b\ PgVBf9
2)用PreparedStatement来执行sql语句 +3`alHUK
String sql; ':}\4j&{E
sql = "insert into user (id,name) values (?,?)"; .l|$dE/E
PreparedStatement ps = cn.prepareStatement(sql); ExM,g' 7
ps.setInt(1,xxx); !+ njS
ps.setString(2,xxx); DJ%PWlK5
... |' .
ResultSet rs = ps.executeQuery(); // 查询 &?vgP!d&M
int c = ps.executeUpdate(); // 更新 kl,3IKHa
s7EinI{^
3、处理执行结果 L(o15
查询语句,返回记录集ResultSet e*!kZAf
更新语句,返回数字,表示该更新影响的记录数 qVPeB,kIz
ResultSet的方法 rbQR,Nf2x
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .G^YqJ 4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 h1{3njdr
~v83pu1!2s
4、释放连接 5?L<N:;J_
cn.close(); KU;9}!#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q &t<Y^B
xCKRxF
可滚动、更新的记录集 0g\(+Qg^
1、创建可滚动、更新的Statement [r-p]"R
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); SB7c.H,
该Statement取得的ResultSet就是可滚动的 >Se,;cB'/]
2、创建PreparedStatement时指定参数 T)CP2U
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /@Zrq#o
zx
ResultSet.absolute(9000); v3qA":(w+(
批量更新 b6 M
1、Statement *'X3z@R
Statement sm = cn.createStatement(); v
LZoa-w:
sm.addBatch(sql1); Kg$Mx
sm.addBatch(sql2); `W-Fssu
... N<-Gk6`C/
sm.executeBatch()
FC*[*
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 wAd9
2、PreparedStatement !by\9
?n
PreparedStatement ps = cn.preparedStatement(sql); kW (Bkuc)
{ m4g$N)
ps.setXXX(1,xxx); L-\GHu~)
... go"Hf_
ps.addBatch(); 2"5v[,$1H
} :Yks|VJ1
ps.executeBatch(); 'QIqBU'~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !a<ng&H^U
\L\b $4$d
事务的处理 G9:l'\
1、关闭Connection的自动提交 Wm3X[?V
cn.setAutoCommit(false); d/Q%IeEL.
2、执行一系列sql语句 xvy.=(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close #,.Hr#3nI
Statement sm ; 9C\Fq-
sm = cn.createStatement(insert into user...); f
{"?%Ku#
sm.executeUpdate(); Lk$B{2^n
sm.close(); MWL%
Bz
sm = cn.createStatement("insert into corp...); rD>f|kA?L
sm.executeUpdate(); Yrn)VV[)h
sm.close(); L:8q8i
3、提交 [PM4k0YC 8
cn.commit(); N36_C;K-z
4、如果发生异常,那么回滚 P2*<GjV`S/
cn.rollback();