java 数据库基本操作 h/~BUg'
1、java数据库操作基本流程 T:5%sN;#O
2、几个常用的重要技巧: siZ_JJW
可滚动、更新的记录集 L. ?dI82c
批量更新 gx
R|S
事务处理 hf5SpwxLiH
}n8;A;axi
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 4gt "dfy+
1、取得数据库连接 zC;lfy{f=
1)用DriverManager取数据库连接 e[o
;l
例子 &8L\FAY0%9
String className,url,uid,pwd; TTak[e&j3
className = "oracle.jdbc.driver.OracleDriver"; 3Ya6yz
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; k$- q;VI
uid = "system"; Eu~wbU"%
pwd = "manager"; JU+'UK630
Class.forName(className); T1[ZrY'0
Connection cn = DriverManager.getConnection(url,uid,pwd); "<R
2oo)^
2)用jndi(java的命名和目录服务)方式 |VF"Cjw?
例子 ai9,4
String jndi = "jdbc/db"; *%+buHe
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3`8xh9O
DataSource ds = (DataSource) ctx.lookup(jndi); $ !=:ES
Connection cn = ds.getConnection(); [<$d@}O
多用于jsp中 [m&ZAq
2、执行sql语句 q9]L!V9Rv
1)用Statement来执行sql语句 LZ dNG\-
String sql; r}Av"
Statement sm = cn.createStatement(); Av4E?@R
sm.executeQuery(sql); // 执行数据查询语句(select) l~c>jm8.
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Qj[O$L0 $
2)用PreparedStatement来执行sql语句 4'|:SyOm
String sql; J, >PLQAa
sql = "insert into user (id,name) values (?,?)"; ;itg>\p3
PreparedStatement ps = cn.prepareStatement(sql); rmJ847%y`
ps.setInt(1,xxx); HKw4}FC*
ps.setString(2,xxx); a$&6a
... o:*iT=l
ResultSet rs = ps.executeQuery(); // 查询 <7) 6*u
int c = ps.executeUpdate(); // 更新 Lxrn#Z eM
>?FCv7qN
3、处理执行结果 8 z7,W3b
查询语句,返回记录集ResultSet P#oV ^
更新语句,返回数字,表示该更新影响的记录数 $o H,:x?}
ResultSet的方法 @b({QM|
1、next(),将游标往后移动一行,如果成功返回true;否则返回false z9w.=[Io
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 xK 'IsMo[
2a-hf|b1
4、释放连接 5aQg^f%\
cn.close(); yt,;^o^
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection W}3vY]
feHAZ.8rp+
可滚动、更新的记录集 )uWNN"
1、创建可滚动、更新的Statement 3f8Z?[Bb@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `vBa.)u
该Statement取得的ResultSet就是可滚动的 i|'t!3I^m
2、创建PreparedStatement时指定参数 pSUp"wch
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ZK*aVYnu
ResultSet.absolute(9000); n/D]r
批量更新 M lwQ_5O
1、Statement h]9^bX__Z
Statement sm = cn.createStatement(); &|] ^ u/
sm.addBatch(sql1); W{aN S@1
sm.addBatch(sql2); ywte\}
... ZeV)/g,w
sm.executeBatch() P://Zi6>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 S45_-aE
2、PreparedStatement ,BAF?}04=
PreparedStatement ps = cn.preparedStatement(sql); L,L7WObA
{ (0f^Hh wF
ps.setXXX(1,xxx); $S{j}74[
... !CKUkoX
ps.addBatch(); h65j,v6B
} rg.if"o
ps.executeBatch(); pXa? Q@6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 N3) v,S-
k*^W
lCZ3
事务的处理 #w6CL
1、关闭Connection的自动提交 l[ k$O$jo
cn.setAutoCommit(false); :B~c>:
2、执行一系列sql语句 '"^JNb^I
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [%kucG C7
Statement sm ; 3s2M$3r)6
sm = cn.createStatement(insert into user...); gZv<_0N
sm.executeUpdate(); Hc9pWr"N
sm.close(); SGm?"esEt
sm = cn.createStatement("insert into corp...); 9_{!nQC.g
sm.executeUpdate(); [DwB7l)O(
sm.close(); c2/HY8ttRD
3、提交 #J_i 5KmXJ
cn.commit(); Gy%e%'
4、如果发生异常,那么回滚 1O4"MeF
cn.rollback();