java 数据库基本操作 -I.d}[
1、java数据库操作基本流程 ntFT>g{B
2、几个常用的重要技巧: ]\ !5}L
可滚动、更新的记录集 R:X0'zeRr
批量更新 +{<#(}
事务处理 ^ D%FX!$
ziPR>iz-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ",6M)3{|c
1、取得数据库连接 #>lG7Ns|4
1)用DriverManager取数据库连接 #J (~_%Wi
例子 JN+_|`
String className,url,uid,pwd; jhu 07HX_
className = "oracle.jdbc.driver.OracleDriver"; NIdZ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; El\%E"Tk%
uid = "system"; yAL[[
pwd = "manager"; &>d:R_Q]
Class.forName(className); >NYW{(j
Connection cn = DriverManager.getConnection(url,uid,pwd); wX >*H
2)用jndi(java的命名和目录服务)方式
#$1Z
例子 k:jSbbQ
String jndi = "jdbc/db"; I[)% , jd
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); mKrh[nA
DataSource ds = (DataSource) ctx.lookup(jndi); h2ytS^
Connection cn = ds.getConnection(); 7frTTSZ
多用于jsp中 }>)[<;M>%
2、执行sql语句 n3AaZp[
1)用Statement来执行sql语句 (aOv#Vor]%
String sql; {9UEq0
Statement sm = cn.createStatement(); ry9T U
sm.executeQuery(sql); // 执行数据查询语句(select) >B]'fUt5a
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); x
}Ad_#q
2)用PreparedStatement来执行sql语句 'AN>`\mR$
String sql; =[b)1FUp
sql = "insert into user (id,name) values (?,?)"; RuII!}*
PreparedStatement ps = cn.prepareStatement(sql); /1Ue?)g
ps.setInt(1,xxx); ck?YI]q|
ps.setString(2,xxx); dXF^(y]l
... p
w8 s8?
ResultSet rs = ps.executeQuery(); // 查询 ,) J~ ,^f6
int c = ps.executeUpdate(); // 更新 9IX/wm"
lXcx@#~
3、处理执行结果 o2<#s)GpY
查询语句,返回记录集ResultSet :oJ=iB'Zc
更新语句,返回数字,表示该更新影响的记录数 'Ut7{rZ5
ResultSet的方法 hjZKUMG(k
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 'yMF~r3J
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ggJO:$?$L
/p8dZ+X
4、释放连接 O,Cb"{qH8
cn.close(); nBk)WX&[K
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection uj :%#u
BNL;Biyt7
可滚动、更新的记录集 H\TI[JPAl
1、创建可滚动、更新的Statement g$b<1:8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); dC RyOid$
该Statement取得的ResultSet就是可滚动的 /~zai}
2、创建PreparedStatement时指定参数 yUpgoX(6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); FCnm1x#
ResultSet.absolute(9000); H1}
RWaJ
批量更新 #O+),,WS
1、Statement Q%xC}||1s"
Statement sm = cn.createStatement(); C=eF.FB;'
sm.addBatch(sql1); yu;P +G
sm.addBatch(sql2); xg3:} LQ
... \B,(k<
sm.executeBatch() Oil?JI Hq
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 euC&0Ee2
2、PreparedStatement Hv2De0W
PreparedStatement ps = cn.preparedStatement(sql); j KoG7HH
{ ahJ`T*)HY
ps.setXXX(1,xxx); MUaq7B_>
... Ow+GS{-q
ps.addBatch(); eQ$Y0qH1E
} TJ2=m9Z
ps.executeBatch(); Q)~aiI0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 S8kCp;
@KXV%a'
事务的处理 +KF^Z$I
1、关闭Connection的自动提交 [@&m4 7
cn.setAutoCommit(false); 6Pz4\uE=
2、执行一系列sql语句 ts,ZvY]
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^PDJ0k/u1
Statement sm ; >"??!|XG^
sm = cn.createStatement(insert into user...); >Rl"
sm.executeUpdate(); DHyq^pJ
sm.close(); &yct!YOB2
sm = cn.createStatement("insert into corp...); {AhthR%(1
sm.executeUpdate(); DF&(8NoX~
sm.close(); U&g@.,Y#
3、提交 Fe# 1
cn.commit(); gt\E`HB8E
4、如果发生异常,那么回滚 B~'vCuE
cn.rollback();