java 数据库基本操作 8.XoVW#
1、java数据库操作基本流程 /JHc! D
2、几个常用的重要技巧: V#XppYU
可滚动、更新的记录集 ,{BaePMp
批量更新 s!?`T1L
事务处理 lBK}VU^
:[O
8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ()5[x.xK@
1、取得数据库连接 X;i~<Tq
1)用DriverManager取数据库连接 EH256f(&
例子 gu0j.XS^
String className,url,uid,pwd; \9cG36
className = "oracle.jdbc.driver.OracleDriver"; 6G
#}Q/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; :+qF8t[L
uid = "system"; l5zS
pwd = "manager"; pm_`>3
Class.forName(className); ;5zz<;Zy
Connection cn = DriverManager.getConnection(url,uid,pwd); x c/}#>ED
2)用jndi(java的命名和目录服务)方式 E7.2T^o;M
例子 P>s[tM
String jndi = "jdbc/db"; !ePr5On
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); XZsz/#
DataSource ds = (DataSource) ctx.lookup(jndi); fQi4\m
Connection cn = ds.getConnection(); S 5/R_5
多用于jsp中 D)j(,vt
2、执行sql语句 sejg&8
1)用Statement来执行sql语句 }|g\ 8jq
String sql; *:Vq:IU[D
Statement sm = cn.createStatement(); 0s/w,?
sm.executeQuery(sql); // 执行数据查询语句(select) Hkwl>R$
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); #73F}
tZ^
2)用PreparedStatement来执行sql语句 i.3=!6z
String sql; Nd$W0YN:
sql = "insert into user (id,name) values (?,?)"; <,[cQ I/
PreparedStatement ps = cn.prepareStatement(sql); J%x\=Sv
ps.setInt(1,xxx); BQ=PW|[
ps.setString(2,xxx); g;2?F[8Th
... -o!$tI&
ResultSet rs = ps.executeQuery(); // 查询 n/Sw P
int c = ps.executeUpdate(); // 更新 F
P* lQRA
hWD;jR
3、处理执行结果 )(ImLbM)
查询语句,返回记录集ResultSet jN[`L%Qm
更新语句,返回数字,表示该更新影响的记录数 n?- })
ResultSet的方法 %p2Sh)@M
1、next(),将游标往后移动一行,如果成功返回true;否则返回false y+"X~7EX
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )iYxt:(,
,Wk?I%>
4、释放连接 ]j`c]2EuP
cn.close(); RxI(:i?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection v^#~98g]
j`~Ms>
可滚动、更新的记录集 wE? 'Cl
1、创建可滚动、更新的Statement KwPOO{4]g
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7R6ry(6N
该Statement取得的ResultSet就是可滚动的 l)Crc-:}4j
2、创建PreparedStatement时指定参数 [co% :xJu
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); gP0LCK>
ResultSet.absolute(9000); mj9 <%P
批量更新 +VO-oFE |
1、Statement L&u$t}~)
Statement sm = cn.createStatement(); Uk^B"y_
sm.addBatch(sql1); (C@m Lu)
sm.addBatch(sql2); AaWs}M
... ioYGZ%RG#
sm.executeBatch() [_1G@S6Ex
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 PE5R7)~A
2、PreparedStatement <Bw^!.jAF
PreparedStatement ps = cn.preparedStatement(sql); umt.Um.m2
{ #,":vr
ps.setXXX(1,xxx); j$?{\iXZ
... C-\S/yd
ps.addBatch(); AlAY iUw{
} 9}PhN<Gd
ps.executeBatch(); Y8-86 *zC
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 f;W|\z'
7?GIS '
事务的处理 nV -mPyfL8
1、关闭Connection的自动提交
^,/RO5
cn.setAutoCommit(false); .k%[4:Fe
2、执行一系列sql语句 ?4q4J8j
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;[=8B\?
Statement sm ; BqD'8zLD
sm = cn.createStatement(insert into user...); Rb%8)t
x
sm.executeUpdate(); auK?](U
sm.close(); 56zL"TF`
sm = cn.createStatement("insert into corp...); UA48Ug
sm.executeUpdate(); *>n;SuT_
sm.close(); =;2%a(
3、提交 MP_ ~<Q
cn.commit(); Y@N,qHtz
4、如果发生异常,那么回滚 SqEgn}m$
cn.rollback();