java 数据库基本操作 79 \SbB
1、java数据库操作基本流程 [+!~RV_
2、几个常用的重要技巧: -n:;/ere7-
可滚动、更新的记录集 v2ab84
C*
批量更新 ;ykX]5jGh
事务处理 )&[ol9+\
NftR2
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {>d\
1、取得数据库连接 CN6b982&
1)用DriverManager取数据库连接 ~3$:C#"Dl
例子 f9HoQDFsM
String className,url,uid,pwd; $ VeQvm*
className = "oracle.jdbc.driver.OracleDriver"; M
y!;N1
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; z>HM$n`YD
uid = "system"; {3BWT
pwd = "manager"; {A\y4D@
Class.forName(className); `pXPF}T
Connection cn = DriverManager.getConnection(url,uid,pwd); 2U3WH.o
2)用jndi(java的命名和目录服务)方式 X
CHN'l'
例子 36d6KS 7
String jndi = "jdbc/db"; ,o\~d?4
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); H284
]i
DataSource ds = (DataSource) ctx.lookup(jndi); wx^1lC2
Connection cn = ds.getConnection(); h@{CMe
多用于jsp中 V0*9Tnc
2、执行sql语句 5r^u7k
1)用Statement来执行sql语句 H,)2Ou-Wn
String sql; R}$A>)%dx
Statement sm = cn.createStatement(); %`j2?rn
sm.executeQuery(sql); // 执行数据查询语句(select) m</nOf+C
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8'0KHn{#
2)用PreparedStatement来执行sql语句 << aAYkx<
String sql; /&RS+By(i
sql = "insert into user (id,name) values (?,?)"; G:;(,
PreparedStatement ps = cn.prepareStatement(sql); #+;0=6+SM
ps.setInt(1,xxx); <a=k"'0
ps.setString(2,xxx); Es+BV+x[.c
... y73@t$|
ResultSet rs = ps.executeQuery(); // 查询 0GnbE2&
int c = ps.executeUpdate(); // 更新 `BY&&Bv#?
MU~nvs;:
3、处理执行结果 )%9P ;/
查询语句,返回记录集ResultSet -;t]e6[
更新语句,返回数字,表示该更新影响的记录数 *Ui>NTl
ResultSet的方法 Z"a]AsG/Q#
1、next(),将游标往后移动一行,如果成功返回true;否则返回false u )KtvC!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2_;3B4GDF
\Zo
xJ&
4、释放连接 :_+Fe,h>|
cn.close(); QfsTUAfR
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection M2y"M ,k4
u9) <i]2
可滚动、更新的记录集 X"
;ly0Mb
1、创建可滚动、更新的Statement c>e~$b8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); W\<p`xHk
该Statement取得的ResultSet就是可滚动的 x2H?B`5
2、创建PreparedStatement时指定参数 j?P8&Fm<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ]0)=0pc]E
ResultSet.absolute(9000); IQCIc@5
批量更新 s~Od(,K
1、Statement *27*&&=)H
Statement sm = cn.createStatement(); &l NHNu[
sm.addBatch(sql1); olO&7jh7|
sm.addBatch(sql2); $@:z4S(
... IMay`us]:8
sm.executeBatch() p;m2RHYF
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 B0}f,J\
2、PreparedStatement *$o{+YP
PreparedStatement ps = cn.preparedStatement(sql); {9C+=v?
{ 5KFd/9
ps.setXXX(1,xxx); !{L`Zd;C>w
... y!?l;xMS
ps.addBatch(); FUj4y 9X
} yp:_W@
ps.executeBatch(); 0qrsf!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 uM<6][^`
'Nbae-pf
事务的处理 l ,T*b
1、关闭Connection的自动提交 -] .Y";
cn.setAutoCommit(false); 4_w+NI,;
2、执行一系列sql语句 H#B~h4#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .<C}/Cl
Statement sm ; )m Uc
!TP
sm = cn.createStatement(insert into user...); BI,j/SRK
sm.executeUpdate(); a}+7MEUmZ/
sm.close(); /U#{6zeM[,
sm = cn.createStatement("insert into corp...); {D
jz']
sm.executeUpdate(); t<6`?\Gk
sm.close(); wcT0XXh
3、提交 FV&&
cn.commit(); \HB4ikl
4、如果发生异常,那么回滚 @,63%
cn.rollback();