java 数据库基本操作 0chpC)#Q3;
1、java数据库操作基本流程 ']+!i a
2、几个常用的重要技巧: xa<KF
可滚动、更新的记录集 !J X7y%J
批量更新 #)twk`!^
事务处理 \)wch P_0
B7|%N=S%/
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 _od /)#
1、取得数据库连接 vR2);ywX
1)用DriverManager取数据库连接 Iz. h
例子 L%Rw]=v}v
String className,url,uid,pwd; I}0? d
className = "oracle.jdbc.driver.OracleDriver"; I9>vm]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7iwck.*
uid = "system"; SG|AJ9
pwd = "manager"; fR'!p: ~
Class.forName(className); {Bk` Zlki
Connection cn = DriverManager.getConnection(url,uid,pwd); !t"/w6X1I
2)用jndi(java的命名和目录服务)方式 yI#qkl-
例子 <#nU 06 fN
String jndi = "jdbc/db"; fDplYn#
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +_cigxpTc
DataSource ds = (DataSource) ctx.lookup(jndi); FA)ot)]
Connection cn = ds.getConnection(); ex1!7A!}g
多用于jsp中 -Fn/=
2、执行sql语句 4dCXBTT
1)用Statement来执行sql语句 e7{6<[k3+$
String sql; K{/i2^4
Statement sm = cn.createStatement(); %7aJSuQN%
sm.executeQuery(sql); // 执行数据查询语句(select) f77W{T4
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z$KyK.FUU
2)用PreparedStatement来执行sql语句 nAl
\9#M
String sql; A^X\
sql = "insert into user (id,name) values (?,?)"; hp(MKfh H
PreparedStatement ps = cn.prepareStatement(sql); Y,Z$U| U
ps.setInt(1,xxx); YjTr49Af0
ps.setString(2,xxx); [m
h>N$
... eZ]r"_?
ResultSet rs = ps.executeQuery(); // 查询
~,&8)1
int c = ps.executeUpdate(); // 更新 A>upT'
9c k"JMla
3、处理执行结果 m[2[9bQ0
查询语句,返回记录集ResultSet CkNR{?S
更新语句,返回数字,表示该更新影响的记录数 fg#e*7Odn
ResultSet的方法 U2<q dknB
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,
otXjz
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 [#Gu?L_W
L%5y@b{AR
4、释放连接 .`+~mQ
Wn
cn.close(); 3MHpP5C
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection {Hl(t$3V`
9v*y&V9/
可滚动、更新的记录集 zc;kNkV#1Y
1、创建可滚动、更新的Statement 3I( n];
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); kJf0..J[#<
该Statement取得的ResultSet就是可滚动的 h;+O96V4.
2、创建PreparedStatement时指定参数 s-Yu(X2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); RS}_cm0
ResultSet.absolute(9000); hf9i%,J
批量更新 xPUukmG:B
1、Statement Kn5C
Statement sm = cn.createStatement(); FO^6c
sm.addBatch(sql1); e\[q3J
sm.addBatch(sql2); WR#h~N
9c
... YQ?hAAJ
sm.executeBatch() YB 7A5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 M$ieM[_T
2、PreparedStatement 5ILKYUg,
PreparedStatement ps = cn.preparedStatement(sql); (VN'1a (
{ I
F!xZ6X8
ps.setXXX(1,xxx); y4p"LD5%^
... ,#,K_oz
ps.addBatch(); ,=Wj*S)~
} F3!@|/<w
ps.executeBatch(); t6KKfb
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6-"tQ,AZ
=#9#unvE!
事务的处理 PZV>A!7C8n
1、关闭Connection的自动提交 CStNCBZ|\
cn.setAutoCommit(false); vmkiw1
2、执行一系列sql语句 |-\anby<
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close LXby(|<j
Statement sm ; ZR3,dW6S
sm = cn.createStatement(insert into user...); m ne)c[Qn
sm.executeUpdate(); M61Nl)|mx&
sm.close(); A#I&&qZ
sm = cn.createStatement("insert into corp...); b1IAp >*2l
sm.executeUpdate(); By7lSbj
sm.close(); R#~l[S8u^
3、提交 Rh"O$K~
cn.commit(); ~x'8T!M{
4、如果发生异常,那么回滚 C,>n
cn.rollback();