java 数据库基本操作 Ef,7zKG
1、java数据库操作基本流程 #f|NM7
2、几个常用的重要技巧: + WU|sAK"
可滚动、更新的记录集 `wn<3#
批量更新 0i5T]
)r
事务处理 a=:{{\1o
CN8@c!mB
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 z^ a6%N
1、取得数据库连接 )JY_eG&2Dx
1)用DriverManager取数据库连接
(dLE<\E
例子 &*>CPO
String className,url,uid,pwd; dIBKE0`
className = "oracle.jdbc.driver.OracleDriver"; cKi^C
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; p ,[XT`q^
uid = "system"; r{/ G\
pwd = "manager"; LEn=dU
Class.forName(className); _v~D{H&}
Connection cn = DriverManager.getConnection(url,uid,pwd);
')~Y
2)用jndi(java的命名和目录服务)方式 M<#)D
例子 q5'yD;[hE
String jndi = "jdbc/db"; /IrR,bvA
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8XS{6<
DataSource ds = (DataSource) ctx.lookup(jndi); AihL>a%
Connection cn = ds.getConnection(); qmue!Fv#g
多用于jsp中 H/p-YtY
2、执行sql语句
O#Zs3k
1)用Statement来执行sql语句 xZ S\#{
String sql; bCE7hutl
Statement sm = cn.createStatement(); M0Kh>u
sm.executeQuery(sql); // 执行数据查询语句(select) fzkCI
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); c`$`0}
2)用PreparedStatement来执行sql语句 8f{}ce'E*
String sql; quCWc2pXX
sql = "insert into user (id,name) values (?,?)"; n ]6
0
PreparedStatement ps = cn.prepareStatement(sql); wEHAkc)Q
ps.setInt(1,xxx); w
~L\Ebg
ps.setString(2,xxx); JK:mQ_
... >XXMIz:
ResultSet rs = ps.executeQuery(); // 查询 qj3bt_F!x
int c = ps.executeUpdate(); // 更新 lEYT{
~J. Fl[
3、处理执行结果 VkN[=0a,
查询语句,返回记录集ResultSet <*r<+S
更新语句,返回数字,表示该更新影响的记录数 }n2-*{)x
ResultSet的方法 aaqd:N)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false O{i_?V_
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &JXHDpd$a^
{xBjEhQm
4、释放连接 Z$#ZYD
cn.close(); |qy"%W@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection m`yn9(1Y[
5|~r{w)9
可滚动、更新的记录集 lM|WOmD
1、创建可滚动、更新的Statement @7HOL-i
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +/b4@B7
该Statement取得的ResultSet就是可滚动的 {YKMQI^O/
2、创建PreparedStatement时指定参数 \9|]
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {Hp}F!X$
ResultSet.absolute(9000); NBg>i7KQ
批量更新 !6tC[W`
1、Statement 8SCW.;0
Statement sm = cn.createStatement(); <Z_wDK/UR
sm.addBatch(sql1); Hdq/E>u
sm.addBatch(sql2); "$E!_
... yd2qf
sm.executeBatch() =@Nv:1:r
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 b~haP.Cl:
2、PreparedStatement /c$Ht
PreparedStatement ps = cn.preparedStatement(sql); _#YHc[Wz
{ q5\LdI2
ps.setXXX(1,xxx); A_(+r
... kX ,FQG>
ps.addBatch(); ndCS<ojcBP
} gh #w%g1g
ps.executeBatch(); 7 NB"oU^h%
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )[M<72
X+gz+V/
事务的处理 0)`lx9&h
1、关闭Connection的自动提交 #HnyE+tD
cn.setAutoCommit(false); zIQc#F6\5
2、执行一系列sql语句 im?XXsH'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close xu?QK6D:
Statement sm ; :56lzsWUE<
sm = cn.createStatement(insert into user...); |phWK^
sm.executeUpdate(); (Y.$wMB
sm.close(); uQ%HLL-W/
sm = cn.createStatement("insert into corp...); {!g.255+
sm.executeUpdate(); >ya-
sm.close(); *r?51*J
3、提交 + $a:X
cn.commit(); Obc3^pV&
4、如果发生异常,那么回滚 Ae_ E;[mj
cn.rollback();