java 数据库基本操作 }+
TA+;
1、java数据库操作基本流程 BKW%/y"
2、几个常用的重要技巧: S L~5[f
可滚动、更新的记录集 Z4PAdT
批量更新 g+u5u\k
事务处理 ._}Dqg$
M0uC0\'#P
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~RnBs`&!
1、取得数据库连接 qnU$Pd
1)用DriverManager取数据库连接 lK y4Nry9
例子 1?#Wg>7'
String className,url,uid,pwd; X\]Dx./
className = "oracle.jdbc.driver.OracleDriver"; @-}!o&G0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Z+! 96LR
uid = "system"; q3Y49d
pwd = "manager"; _1HEGX\
Class.forName(className); uGS^*W$
Connection cn = DriverManager.getConnection(url,uid,pwd); >qynd'eToR
2)用jndi(java的命名和目录服务)方式 ;?!pcv Ui
例子 vjXCArS
String jndi = "jdbc/db"; v1Jg8L=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); { :_qa |
DataSource ds = (DataSource) ctx.lookup(jndi); C~VyM1inD
Connection cn = ds.getConnection(); 6T A2
多用于jsp中 wHhIa3_v
2、执行sql语句 2dBjc{
1)用Statement来执行sql语句 )N]%cO(^
String sql; azpXE
Statement sm = cn.createStatement(); [r=U-
sm.executeQuery(sql); // 执行数据查询语句(select) *uZ'MS
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); lyrwm{&
2)用PreparedStatement来执行sql语句 o|c"W}W
String sql; cjBHczkY
sql = "insert into user (id,name) values (?,?)"; F5f1j]c
PreparedStatement ps = cn.prepareStatement(sql); AV["%$:
ps.setInt(1,xxx); 7:h_U9Za?$
ps.setString(2,xxx); kZvh<NFh_
... Q02:qn?T
ResultSet rs = ps.executeQuery(); // 查询 PhC{Gg
int c = ps.executeUpdate(); // 更新 82Nw6om6i
08E ,U
3、处理执行结果 5%(xZ
6
查询语句,返回记录集ResultSet B?<Z(d7
更新语句,返回数字,表示该更新影响的记录数 OL$^7FB
ResultSet的方法 fsVr<m
1、next(),将游标往后移动一行,如果成功返回true;否则返回false u&ozc
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2HJGp+H
"0l7%@z*)q
4、释放连接 uB uwE6
cn.close(); 9IG3zM f
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection G@Vz
}B:=
( 0Z3Ksfj1
可滚动、更新的记录集 G@]|/kN1y
1、创建可滚动、更新的Statement O(f&0h
!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); aQhr$aH
该Statement取得的ResultSet就是可滚动的 >d#6qXKAU
2、创建PreparedStatement时指定参数 } T<oLvS
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); pNR69/wGi
ResultSet.absolute(9000); 1`8(O >5
批量更新 oq }Q2[.b
1、Statement vH9Gf
Statement sm = cn.createStatement(); t>>\U X
sm.addBatch(sql1); +S>}<OE
sm.addBatch(sql2); yzmwNsu
... wPU<jAQyp
sm.executeBatch() <S%kwS
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 @IwVR
2、PreparedStatement QG=&{-I~[3
PreparedStatement ps = cn.preparedStatement(sql); SB` "%6
{ " ^:$7~%bA
ps.setXXX(1,xxx); |MXv
w6P
... vxC,8Z
ps.addBatch(); auT$-Ki8
} i#y3QCNqf^
ps.executeBatch(); 1)f~OL8o
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 y[@<goT
GCEq3
^/
事务的处理 :,(ZMx\
1、关闭Connection的自动提交 mh8~w~/[
cn.setAutoCommit(false); aF\?X&|
2、执行一系列sql语句 spt='!)4
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Ev;ocb,
Statement sm ; vVi))%&S(
sm = cn.createStatement(insert into user...); g$ oe00b
sm.executeUpdate(); )z#M_[zC>
sm.close(); uua1_#a
sm = cn.createStatement("insert into corp...); *!y.!v*
sm.executeUpdate(); ,o)U9<
sm.close(); Q-GnNT7MB3
3、提交 hq^@t6!C\m
cn.commit(); N~An}QX|
4、如果发生异常,那么回滚 A?xb
u*zV,
cn.rollback();