java 数据库基本操作 YxJ`-6
1、java数据库操作基本流程 _-/x;C
2、几个常用的重要技巧: r
sLc&2F
可滚动、更新的记录集 W<Z$YWr
批量更新 FZpsL-yx^N
事务处理 9
Va40X1
EMhr6</
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 dnwdFsf
1、取得数据库连接 O4E(R?wd
1)用DriverManager取数据库连接 l~['[Ub0)
例子 YN^T$,*
String className,url,uid,pwd; ?gN9kd)
className = "oracle.jdbc.driver.OracleDriver"; R4SxFp
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _jmkl
B
uid = "system"; /~*Cp9F"]
pwd = "manager"; /1[gn8V691
Class.forName(className); 0V3gKd7
Connection cn = DriverManager.getConnection(url,uid,pwd); EI\v
2)用jndi(java的命名和目录服务)方式 XCm\z9F
例子 =-qf ;5[|
String jndi = "jdbc/db"; gfm;xT/y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [fxuUmU
DataSource ds = (DataSource) ctx.lookup(jndi); q3)wr%!k5D
Connection cn = ds.getConnection(); k}zd'
/b
多用于jsp中 \B&6TeR
2、执行sql语句 Xem5@
(u
1)用Statement来执行sql语句 e/>:K' {
String sql; qOi5WX6F/
Statement sm = cn.createStatement(); GmbIFOT~
sm.executeQuery(sql); // 执行数据查询语句(select) #
kEOKmO
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); J\{$ot
2)用PreparedStatement来执行sql语句 G'9{a'
String sql; JOHRmfqR
sql = "insert into user (id,name) values (?,?)"; (]XbPW
PreparedStatement ps = cn.prepareStatement(sql); &bLC(e]
ps.setInt(1,xxx); 74_xR
ps.setString(2,xxx); ~.6|dw\p!
... 7]s%rya
ResultSet rs = ps.executeQuery(); // 查询 FsY(02
int c = ps.executeUpdate(); // 更新 qg4fR' i
f05=Mc&)
3、处理执行结果 x'qWM/
查询语句,返回记录集ResultSet -`Q}tg>cT
更新语句,返回数字,表示该更新影响的记录数 AK *N
ResultSet的方法 HIGNRm
1、next(),将游标往后移动一行,如果成功返回true;否则返回false m?;$;x~Dj
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |l7%l&!
%b=p< h'(
4、释放连接 8*s7m
cn.close(); %iJ|H(P
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Sl>>SP
DjwQ`MA
可滚动、更新的记录集 M6Pw/S!
1、创建可滚动、更新的Statement ] H&c'
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); C(o.Cy6
该Statement取得的ResultSet就是可滚动的 ru{f]|
2、创建PreparedStatement时指定参数 mM5|K@0|
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); nJT4w|Yx
ResultSet.absolute(9000); JUQg 'D
批量更新 K%gP5>y*9>
1、Statement rY,PSK/j
Statement sm = cn.createStatement(); HH8;J66I&
sm.addBatch(sql1); etyCrQ
?U
sm.addBatch(sql2); c@(1:,R
... :}9j^}"c3
sm.executeBatch() /K|:9Q$K6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 FZXyfZw!|
2、PreparedStatement %!y89x=E
PreparedStatement ps = cn.preparedStatement(sql); VE]6wwV2
{ 8Z# 21X>
ps.setXXX(1,xxx); AIh*1>2Xn
... _faJ B@a_
ps.addBatch(); Tn A?u (R%
} <'&F;5F3V
ps.executeBatch(); yN\e{;z`
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :wipE]~4t
-;pOh;WG
事务的处理 }+0z,s~0.
1、关闭Connection的自动提交 R#qI(V
cn.setAutoCommit(false); QaQ'OrP
2、执行一系列sql语句 |s=`w8p
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 8Kk\*8 <
Statement sm ; OCnFEX"
sm = cn.createStatement(insert into user...); 0E6lmz`O
sm.executeUpdate(); GaBTj_3
sm.close(); VT=K"`EpQ
sm = cn.createStatement("insert into corp...); JE!("]&
sm.executeUpdate(); c+2%rh1
sm.close(); %idk@~H Cg
3、提交 0@pu@ DP~
cn.commit(); J`oTes,
4、如果发生异常,那么回滚 }U[-44r:
cn.rollback();