java 数据库基本操作 )-RI
1、java数据库操作基本流程 d/m.VnW
2、几个常用的重要技巧: 6dzY9
可滚动、更新的记录集 C
`>1x`n
批量更新 S(c&XJR
事务处理 GJ3@".+6
hm&cRehU
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 oaK&!$S]
1、取得数据库连接 o\M
1)用DriverManager取数据库连接 K).Gj2 $
例子 LzS)WjEN
String className,url,uid,pwd; AwC"c '
className = "oracle.jdbc.driver.OracleDriver"; @u.%z# h"1
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7a0kat'\
uid = "system"; Q#Vg5H4
pwd = "manager"; V"r2 t9A
Class.forName(className);
OH*
Connection cn = DriverManager.getConnection(url,uid,pwd); Pf 4b/w/
2)用jndi(java的命名和目录服务)方式 tr<iFT}C
例子 9A-=T>|of
String jndi = "jdbc/db"; ;:%*h2
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); d7*fP S
DataSource ds = (DataSource) ctx.lookup(jndi); #7Pnw.s3zz
Connection cn = ds.getConnection(); saj%[Gsy
多用于jsp中 `F^~*FnR,B
2、执行sql语句 uE}A-\G
1)用Statement来执行sql语句 {tN?)~ZQ
String sql; WqHsf1?N
Statement sm = cn.createStatement(); %+{[ %?xh
sm.executeQuery(sql); // 执行数据查询语句(select) N1vPY]8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); }%@q; "9`
2)用PreparedStatement来执行sql语句 8}^R jMgI
String sql; t.ci!#/d
sql = "insert into user (id,name) values (?,?)"; !qQB}sAf
PreparedStatement ps = cn.prepareStatement(sql); &.ilku/
ps.setInt(1,xxx); V=?qU&r<+
ps.setString(2,xxx); \a.^5g
... 0[O ."9
ResultSet rs = ps.executeQuery(); // 查询 b":3J)Y6.
int c = ps.executeUpdate(); // 更新 6N<v&7cSB
2j UEL=+Y
3、处理执行结果 FD+y?UF
查询语句,返回记录集ResultSet \?VNr2
更新语句,返回数字,表示该更新影响的记录数 eL` }j9
ResultSet的方法 'T7=.Hq<4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false lQ]8PR
t8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 K!\$M BI
V?0Yzg$sy
4、释放连接 ]nM 2J}7
cn.close(); ,ezC}V0M
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection DA(ur'D
v"K #
可滚动、更新的记录集 ?C6DK{S(
1、创建可滚动、更新的Statement ^Fe%1Lnt
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); vRR(b!Lq
该Statement取得的ResultSet就是可滚动的 V(^aG=TaW:
2、创建PreparedStatement时指定参数 :CR1Oy 9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); dP7nR1GS
ResultSet.absolute(9000); ,1! ~@dhs
批量更新 Y!K5?kk
1、Statement '@WpJ{]A
Statement sm = cn.createStatement(); 'PBuf:9lN
sm.addBatch(sql1); z
K +C&X
sm.addBatch(sql2); %^?yI
... u |EECjJn
sm.executeBatch() a(a2xa
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !SxZN d v
2、PreparedStatement [l7 G9T}/[
PreparedStatement ps = cn.preparedStatement(sql); 0?0$6F
{ .GM}3(1fX`
ps.setXXX(1,xxx); ] C&AU[U*
... !VXs
yH3r5
ps.addBatch(); }nO[;2Na
} M#?^uu'
ps.executeBatch(); p3L0'rY|+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;G=:>m~
)}[:.Zg,3/
事务的处理 ET1>&l:.
1、关闭Connection的自动提交 ui[E,W~
cn.setAutoCommit(false); -<jd/ 5
2、执行一系列sql语句 !idQ-&
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (3[Lz+W.u
Statement sm ; Z{".(?+}1
sm = cn.createStatement(insert into user...); XoZw8cY
sm.executeUpdate(); ,o{|W9
sm.close(); 1yg5d9
sm = cn.createStatement("insert into corp...); l[cBDNlrC;
sm.executeUpdate(); KBO{g:"
sm.close(); =ll{M{0Q]!
3、提交 rRK^vfoJ`
cn.commit(); v6$ }saTX
4、如果发生异常,那么回滚 "4,Zox{^
cn.rollback();