java 数据库基本操作 4_Rv}Yd
1、java数据库操作基本流程 [
**F
2、几个常用的重要技巧: %{P." ki
可滚动、更新的记录集 -| t|w:&
批量更新 v-Uz,3
事务处理 bNz2Uo!0K
_ID =]NJ_
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 1]jUiX=T
1、取得数据库连接 E!>l@
ki
1)用DriverManager取数据库连接 6HR*)*>z_
例子 4b$m\hoN
String className,url,uid,pwd; M$LzV}k
className = "oracle.jdbc.driver.OracleDriver"; QjUojHz%Z
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;W#/;C
_h
uid = "system"; ),I7+rY
pwd = "manager"; AzBpQb*
Class.forName(className); c6pGy%T-
Connection cn = DriverManager.getConnection(url,uid,pwd); }(if|skau
2)用jndi(java的命名和目录服务)方式 E{|n\|
例子 Fd0\T#k
String jndi = "jdbc/db"; ^TY8,qDA
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); SVyJUd_
DataSource ds = (DataSource) ctx.lookup(jndi); =}4lx^`oeT
Connection cn = ds.getConnection(); l'Z `%}R
多用于jsp中 3_k3U
2、执行sql语句 N_8L8ds5
1)用Statement来执行sql语句 qT_E=)1
String sql; ?B,B<@='%
Statement sm = cn.createStatement(); s}Sxl0
sm.executeQuery(sql); // 执行数据查询语句(select) 9!6yo
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @sb00ad2q
2)用PreparedStatement来执行sql语句 /B9jmvj`
String sql; QWxl$%`89<
sql = "insert into user (id,name) values (?,?)"; 15~+Ga4
PreparedStatement ps = cn.prepareStatement(sql); r;aP`MVO<
ps.setInt(1,xxx); &@xeWB
ps.setString(2,xxx); Sst`*PX:
... zn{[]J
ResultSet rs = ps.executeQuery(); // 查询 Tn3f5ka'
int c = ps.executeUpdate(); // 更新 d
"vd_}P~
(wsvj61
3、处理执行结果 mkmVDRK
查询语句,返回记录集ResultSet 4&LoE~
更新语句,返回数字,表示该更新影响的记录数 x@>^ c:-f
ResultSet的方法 O/R>&8R$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false y0XI?Wr
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 0<S(zva7([
DK;/eZe
4、释放连接 @'!61'}f
cn.close(); pBu~($%d
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection DV~1gr,\
eDSBs3k7H
可滚动、更新的记录集 \ow0Y>
1、创建可滚动、更新的Statement #TSLgV'U
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); W(tXq
该Statement取得的ResultSet就是可滚动的 Wh>Y_ k
2、创建PreparedStatement时指定参数
goT:\2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
qz:_T
ResultSet.absolute(9000); YB} _zuZ4&
批量更新 Pjff%r^
1、Statement t`mLZ
<X
Statement sm = cn.createStatement(); T{lJ[M
sm.addBatch(sql1); rzqUI*4%
sm.addBatch(sql2); pf`li]j'V
... 2={ g'k(
sm.executeBatch() d|sI>6jD
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 fJC,ubP[5
2、PreparedStatement 3,B[%!3d
PreparedStatement ps = cn.preparedStatement(sql); I1H:h
{ <cz~q=%v2&
ps.setXXX(1,xxx); wB(
igPi
... :PaFC{O)*
ps.addBatch(); O_PC/=m1@
} $mOK|=tI_
ps.executeBatch(); g%<7Px[W
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {:enoV"
6A/|XwfE/v
事务的处理 6dmTv9e
1、关闭Connection的自动提交 Z@8amT;Y
cn.setAutoCommit(false); /qL&)24
2、执行一系列sql语句 qQ6NxhQo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 9aC>gye!
Statement sm ; | T"{q
sm = cn.createStatement(insert into user...); tI C_/
6
sm.executeUpdate(); q&
Vt*
sm.close(); Yazpfw 7'd
sm = cn.createStatement("insert into corp...); 6C/D&+4
sm.executeUpdate(); Zy7@"C
sm.close(); d*,|?Ar*b
3、提交 %]Nz54!
cn.commit(); rd1&?X
4、如果发生异常,那么回滚 sEvJ!$Tt?I
cn.rollback();