java 数据库基本操作 oO7)7$|1
1、java数据库操作基本流程 ]
X)~D!mA
2、几个常用的重要技巧: a-nn[j
可滚动、更新的记录集 p<mBC2!%
批量更新 Gr}NgyT<!D
事务处理 0ap'6
0"GLgj:9
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 r}(m jC"o
1、取得数据库连接 +Y;hVcE9
1)用DriverManager取数据库连接 B\aVE|~PB
例子 "&`>+Yw
String className,url,uid,pwd; F|'u0JQ)$
className = "oracle.jdbc.driver.OracleDriver"; 6Z=Qs=q
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ZP@NV|B
uid = "system"; >o3R~ [
pwd = "manager"; {61Y;
Class.forName(className); e7-IqQA{3C
Connection cn = DriverManager.getConnection(url,uid,pwd); Brd9"M|d
2)用jndi(java的命名和目录服务)方式 t.\Pn4
例子 5yj# 9H
String jndi = "jdbc/db"; c4Q9foE
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Q`;eI
a6U
DataSource ds = (DataSource) ctx.lookup(jndi); }7xcHVO8-
Connection cn = ds.getConnection(); mQSn*;9\T3
多用于jsp中 \hEIQjfi
2、执行sql语句 IAN={";p
1)用Statement来执行sql语句 A>mk0P)~Q
String sql; FJKlqM5]
Statement sm = cn.createStatement(); 35x]'
sm.executeQuery(sql); // 执行数据查询语句(select) paMK]-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8X278^
#
2)用PreparedStatement来执行sql语句 VfDa>zV3
String sql; G;[O~N3n.
sql = "insert into user (id,name) values (?,?)"; [~G1Rz\h
PreparedStatement ps = cn.prepareStatement(sql); 62Tel4u
ps.setInt(1,xxx); 9HPwl
ps.setString(2,xxx); <9:~u]ixt
... |QR9#Iv
ResultSet rs = ps.executeQuery(); // 查询 6hcK%0z
int c = ps.executeUpdate(); // 更新 $b7@S`5
-II03 S1
3、处理执行结果 S,avvY.U\
查询语句,返回记录集ResultSet 1{a4zGE?[
更新语句,返回数字,表示该更新影响的记录数 lF40n4}
ResultSet的方法 z[O*f#t
1、next(),将游标往后移动一行,如果成功返回true;否则返回false W:9l"'
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 BnDCK@+|Q
BJ'pe[Xa5
4、释放连接 K_:2sDCaN
cn.close(); Y}Dk>IG
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection a"t~K
-yBj7F|
可滚动、更新的记录集 wa`c3PQGu
1、创建可滚动、更新的Statement "Y4glomR[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); f|F=)tJO
该Statement取得的ResultSet就是可滚动的 Q7d@+C
2、创建PreparedStatement时指定参数 xD~r Q$6sI
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); x%[NK[^&
ResultSet.absolute(9000); yx*<c#Uf
批量更新 Je2&7uR0
1、Statement #N~1Ye
Statement sm = cn.createStatement(); /iAhGY
sm.addBatch(sql1); Q00v(6V46
sm.addBatch(sql2); B%kC>J
... EwuRIe;D
sm.executeBatch() >ZeARCf"f
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 esQ`6i
2、PreparedStatement N[fwd=$\#
PreparedStatement ps = cn.preparedStatement(sql); ]%FP*YU4O
{ /eXiWa sQ
ps.setXXX(1,xxx); `R7dn/
... D`'Cnt/
ps.addBatch(); Qe4 % A
} G]EI!-y
ps.executeBatch(); s1#A0%gx
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 PX2b(fR8_O
#Ak|p#7 ^
事务的处理 :xbj&
l
1、关闭Connection的自动提交 @3=q9ftm
cn.setAutoCommit(false); (\r^0>H
2、执行一系列sql语句 8t)gfSG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [F;\NJp6?^
Statement sm ; N7
hl M
sm = cn.createStatement(insert into user...); vW!O("\7K<
sm.executeUpdate(); V8&'dhuG
sm.close(); qbCU&G|)
sm = cn.createStatement("insert into corp...); ^w"hA;
sm.executeUpdate(); 7zA+UWr
sm.close(); 2+S+Y%~
3、提交 G-K{
cn.commit(); ~Z*7:bPN!^
4、如果发生异常,那么回滚 mW+5I-~
cn.rollback();