java 数据库基本操作 &7,::$cu
1、java数据库操作基本流程 N,Js8Z"
2、几个常用的重要技巧: lvRTy|%[
可滚动、更新的记录集 !*3]PZ25a(
批量更新 H|$
*HQm
事务处理 GO.7IL{{
KG4zjQf
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 vw$b]MO!
1、取得数据库连接 A)gSOC{3F)
1)用DriverManager取数据库连接 .mNw^>:cq
例子 "sIww
String className,url,uid,pwd; wwet90_g
className = "oracle.jdbc.driver.OracleDriver"; gi>W&6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; xLb=^Xjec
uid = "system"; (5A8# 7a
pwd = "manager"; F-F1^$]k
Class.forName(className); Fn0|v66
Connection cn = DriverManager.getConnection(url,uid,pwd); 6b%IPbb
2)用jndi(java的命名和目录服务)方式 ArjRoXDE
例子 (w#)|9Cxm
String jndi = "jdbc/db"; 4 aE{}jp1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &'`ki0Xh;
DataSource ds = (DataSource) ctx.lookup(jndi); NHQoP&OG
Connection cn = ds.getConnection(); WFzM s
多用于jsp中 q{%~(A5*H
2、执行sql语句 )G;Hf?M
1)用Statement来执行sql语句 As5-@l`@
String sql; 7PuYrJ
Statement sm = cn.createStatement(); ESk:$`P
sm.executeQuery(sql); // 执行数据查询语句(select) $E!f@L
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Dc*
H:x;
2)用PreparedStatement来执行sql语句 b@Dt]6_UL
String sql;
cml~Oepf
sql = "insert into user (id,name) values (?,?)"; "Ec9.#U/
PreparedStatement ps = cn.prepareStatement(sql); D>^g2!b:
ps.setInt(1,xxx); YNl".c
ps.setString(2,xxx); ll[&O4.F
... cq 5^7.
ResultSet rs = ps.executeQuery(); // 查询 yJ`{\7Uqg
int c = ps.executeUpdate(); // 更新 $=ESY>MO
^O=G%de
3、处理执行结果 7SN61)[m
查询语句,返回记录集ResultSet acar-11_o/
更新语句,返回数字,表示该更新影响的记录数 L0I|V[
ResultSet的方法 K'/if5>Bc
1、next(),将游标往后移动一行,如果成功返回true;否则返回false +J~%z*A
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 tSnsjd<6.
y(/5l
4、释放连接 ?Q$a@)x#
cn.close(); Q/]o'_[vW
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection GY %$7
@4Zkkjc4b
可滚动、更新的记录集 Pd& Npp3
1、创建可滚动、更新的Statement *_d N9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); x4MTE?hT
该Statement取得的ResultSet就是可滚动的 W8Wjq
DQ
2、创建PreparedStatement时指定参数 I(WIT=Wi<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Y@<jvH1
ResultSet.absolute(9000); =}@1Z~
批量更新 %!AzFL
J|Z
1、Statement 2s>BNWTU
Statement sm = cn.createStatement(); #qUGc`
sm.addBatch(sql1); uix/O*^
sm.addBatch(sql2); Q, "8Ty
... pr1bsrMuL
sm.executeBatch() f& \Bs8la
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $pKegK;'z
2、PreparedStatement xX9snSGz
PreparedStatement ps = cn.preparedStatement(sql); r&Qa;-4Pl
{ #d<|_
ps.setXXX(1,xxx); ?RIf0;G
... h@'CmIZc
ps.addBatch(); 34[TM 3L].
} 7
, _b
ps.executeBatch(); >]%$lSCW\D
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 WbBd<^Q
+V9xKhR;x
事务的处理 kwqY~@W
1、关闭Connection的自动提交 ADVS}d!;]
cn.setAutoCommit(false); 6|{&7=1t
2、执行一系列sql语句 Gg]Jp:GF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %rgW}Z5
Statement sm ; =F Y2O`%a
sm = cn.createStatement(insert into user...); Hq,@j{($
sm.executeUpdate(); #D%6b
sm.close(); Qca3{|r`
sm = cn.createStatement("insert into corp...); BjsTHS&
sm.executeUpdate(); !*HJBZ]q
sm.close(); [)dIt@Y&j
3、提交 ?E(X>tH
cn.commit(); !f&hVLs0
4、如果发生异常,那么回滚 `u7^r^>A
cn.rollback();