java 数据库基本操作 fou_/Nrue
1、java数据库操作基本流程 =& q-[JW
2、几个常用的重要技巧: .0
s[{x
可滚动、更新的记录集 b46[fa
批量更新 N p|'7D
事务处理 W,HH *!
\K?(
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Z;GIlgK9
1、取得数据库连接 80?6I%UB<
1)用DriverManager取数据库连接 .:{h{@a
例子 r=~WMDCz@
String className,url,uid,pwd; 11)/] ?/j
className = "oracle.jdbc.driver.OracleDriver"; %NT`C9][
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 1p7cv~#95
uid = "system"; Nm6Z|0S
pwd = "manager"; VqK%^
Class.forName(className); 8_a$kJJ2
Connection cn = DriverManager.getConnection(url,uid,pwd); +mfe*'AU
2)用jndi(java的命名和目录服务)方式 Uvjdx(fY[a
例子 \~@[QGKN
String jndi = "jdbc/db"; 'yPCZ`5H(
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); .3lGX`d{
DataSource ds = (DataSource) ctx.lookup(jndi); Mw"xm9(Q
Connection cn = ds.getConnection(); pg~zUOY
多用于jsp中 e2AN[Ar
2、执行sql语句 Pz]bZPHn
1)用Statement来执行sql语句 7?=43bZl
String sql; Q_&}^
Statement sm = cn.createStatement(); hrs#ZZ:E
sm.executeQuery(sql); // 执行数据查询语句(select) q&XCX$N
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); M.ZEqV+k
2)用PreparedStatement来执行sql语句 jWH{;V&ZV
String sql; f^W[;w
sql = "insert into user (id,name) values (?,?)"; mje<d"bW
PreparedStatement ps = cn.prepareStatement(sql); jM5_8nS&d
ps.setInt(1,xxx); $Wit17j
ps.setString(2,xxx); r]A"Og_U
... cGgM8
ResultSet rs = ps.executeQuery(); // 查询 tcBC!_vF
int c = ps.executeUpdate(); // 更新 vk
@%R
$; Q$W9+
3、处理执行结果 vkd[:CC
查询语句,返回记录集ResultSet KX?o
n sZ
更新语句,返回数字,表示该更新影响的记录数 T-4/d5D[
ResultSet的方法 xGYSi5}z
1、next(),将游标往后移动一行,如果成功返回true;否则返回false <eB<^ &nd
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 _W)`cr
4$yV%[j
4、释放连接 -1qZqU$h
cn.close(); qqnclqkw&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection hi!L\yi
m7$8k@r
可滚动、更新的记录集 A2m_q>>
!
1、创建可滚动、更新的Statement ^"3\iA:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); wL 4ZW8_
该Statement取得的ResultSet就是可滚动的 2R^O,Vu*W
2、创建PreparedStatement时指定参数 s%eyW _
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); wgCvD
ResultSet.absolute(9000);
w3^NL(>
批量更新 CF]i}xpWV
1、Statement =%!e(N'p
Statement sm = cn.createStatement(); ePf+[pV3
sm.addBatch(sql1); S8
:"<B)
sm.addBatch(sql2); &J8Z@^
... hf;S]8|F
sm.executeBatch() V,V*30K5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6}ce1|mkg/
2、PreparedStatement 41u*w2j
PreparedStatement ps = cn.preparedStatement(sql); 1hl]W+9
{ B\\6#
ps.setXXX(1,xxx); Lp_$?MCD.
... B?+.2
ps.addBatch(); {jvOHu
} EE+`i%
ps.executeBatch(); ,eR8~(`=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6SE6AL<b
k!5m@'f
事务的处理 /\ytr%7 ,'
1、关闭Connection的自动提交 &~RR&MdZ2
cn.setAutoCommit(false); =WC-Sj{I
2、执行一系列sql语句 !RS9%ES_?
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (=1)y'.
Statement sm ; U4Z[!s$
sm = cn.createStatement(insert into user...); MWiMUTZg3
sm.executeUpdate(); 2@vJ
sm.close(); ?a
S%
sm = cn.createStatement("insert into corp...); 4t04}vp
sm.executeUpdate(); {9L 5Q
sm.close(); CdY8#+"
3、提交 ]<1HM"D
cn.commit(); q# MM
4、如果发生异常,那么回滚 !lAD
q|$
cn.rollback();