java 数据库基本操作 nHhD<a!
1、java数据库操作基本流程 j.yr5%
2、几个常用的重要技巧: 8en#PH }
可滚动、更新的记录集 y!{/'{?P
批量更新 t6,M
事务处理 yrK--C8
fi-&[llg
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 +_|cZlQ&
1、取得数据库连接 i5~ /+~
1)用DriverManager取数据库连接 ~1wdAq`'a
例子 37M[9m|D*
String className,url,uid,pwd; "=Fn.r4I
className = "oracle.jdbc.driver.OracleDriver"; :xUl+(+
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; J!^~KN6[
uid = "system"; IG3K Pmu
pwd = "manager"; fb=$<0Ocj
Class.forName(className); BoiIr[ (
Connection cn = DriverManager.getConnection(url,uid,pwd); k
@/SeE
2)用jndi(java的命名和目录服务)方式 G~$M"@Q7N
例子 /o06h y
String jndi = "jdbc/db"; ,aj+mlZd2
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); cI4qgV
DataSource ds = (DataSource) ctx.lookup(jndi); .]P;fCQmM
Connection cn = ds.getConnection(); bEXHB
多用于jsp中 [@l
v]+@
2、执行sql语句 <T2~xn
1)用Statement来执行sql语句 (9[C0e S
String sql; 0 c'2rx
Statement sm = cn.createStatement(); I9j+x])
sm.executeQuery(sql); // 执行数据查询语句(select) fM[fS?W
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); kKk |@
2)用PreparedStatement来执行sql语句 &u`rE""
String sql; #?|1~HC
sql = "insert into user (id,name) values (?,?)"; @aPu}Hi
PreparedStatement ps = cn.prepareStatement(sql); Vi-!E
ps.setInt(1,xxx); +nyN+X34B
ps.setString(2,xxx); ZtK%b+MBP
... p 2f
WL
ResultSet rs = ps.executeQuery(); // 查询 =`.5b:e
int c = ps.executeUpdate(); // 更新 `q{'_\gVt(
>D^7v(&
3、处理执行结果 _(s|Q
查询语句,返回记录集ResultSet {4jSj0W
更新语句,返回数字,表示该更新影响的记录数 {c
EKz\RX
ResultSet的方法 %m\G'hY2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false LVcy.kU@]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ppo$&W
&z
r
L|BkN
4、释放连接 mt6uW+t/
cn.close(); wTuRo
J
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection bFdg'_
d~bH!P
可滚动、更新的记录集 mbG^fy'
1、创建可滚动、更新的Statement WF.$gBH"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8_,wOkk_B
该Statement取得的ResultSet就是可滚动的 exMPw;8
2、创建PreparedStatement时指定参数 y42T.oK8c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); o6yZ@R
ResultSet.absolute(9000); O09g b[
批量更新 `[u>NEb
1、Statement !";$Zu
Statement sm = cn.createStatement(); 5N</Z6f'o
sm.addBatch(sql1); NTX+7<
sm.addBatch(sql2); [-94=|S @
... \c^jaK5
sm.executeBatch() ,7$uh):
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Dq1XZ%8
2、PreparedStatement u2m{Yx|
PreparedStatement ps = cn.preparedStatement(sql); FHPZQC8
{ <+JFal
ps.setXXX(1,xxx); 0J,d9a [1
... G/;aZ
ps.addBatch(); zgOwSg8
} b0CaoSWo
ps.executeBatch(); u^.k"46hn
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :qKY@-t7H
00x^zu?N
事务的处理 Q2WrB+/
1、关闭Connection的自动提交 gK_[3FiKt
cn.setAutoCommit(false); -r0\
2、执行一系列sql语句 iYs?B0*JWK
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :h dh$}y
Statement sm ; %lW:8ckL
sm = cn.createStatement(insert into user...); MBrVh6z>
sm.executeUpdate(); F&j|Y>m
sm.close(); p"
W0$t.
sm = cn.createStatement("insert into corp...); z`{zqP:
sm.executeUpdate(); &y wY?ox
sm.close(); e~[z]GLO%
3、提交 d33Nx)No
cn.commit(); (w
4、如果发生异常,那么回滚 ,colGth54
cn.rollback();