java 数据库基本操作 (N&lHLy
1、java数据库操作基本流程 QNARkYY~|
2、几个常用的重要技巧: 1jc,
Y.mP
可滚动、更新的记录集 yqi^>Ce0
批量更新 "FTfk
事务处理 R}lsnX<
[P 06lIO
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 w9,iq@
1、取得数据库连接 &|!7Z4N
1)用DriverManager取数据库连接 T}"6wywM
例子 b@S Cn9
String className,url,uid,pwd; 1RK=,Wx
className = "oracle.jdbc.driver.OracleDriver"; ?r?jl;A&
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; UN zlN
uid = "system"; 4\6N~P86
pwd = "manager"; iVd.f
A
Class.forName(className); sVJ!FC
Connection cn = DriverManager.getConnection(url,uid,pwd); *e-A6Sh
2)用jndi(java的命名和目录服务)方式 :cGt#d6
例子 {K9/HqH
String jndi = "jdbc/db"; _>9.v%5cs(
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |b-]n"}c>
DataSource ds = (DataSource) ctx.lookup(jndi); co9 .wB@
Connection cn = ds.getConnection(); ,(;lIP
多用于jsp中 |37
g ~
2、执行sql语句 K91)qI;BD
1)用Statement来执行sql语句 w9o^s5n
String sql; e _/b2"{
Statement sm = cn.createStatement(); j{NNSi3
sm.executeQuery(sql); // 执行数据查询语句(select) f|R"uW +
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); u%/goxA
2)用PreparedStatement来执行sql语句 %K>.lh@
String sql; [o.B
sql = "insert into user (id,name) values (?,?)";
F0:A]`|
PreparedStatement ps = cn.prepareStatement(sql); 'k4E4OB
ps.setInt(1,xxx); 4H|(c[K;
ps.setString(2,xxx); xj[(P$,P
... R1& [S/
ResultSet rs = ps.executeQuery(); // 查询 55;g1o}}f
int c = ps.executeUpdate(); // 更新 aBNZdX]vzO
sgO'wXcoP
3、处理执行结果 dw TMq*e
查询语句,返回记录集ResultSet
~i21%$
更新语句,返回数字,表示该更新影响的记录数 i:u1s"3~
ResultSet的方法 [+OnV&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false D<V~f B
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 kI:}| _
qQ0cJIISb\
4、释放连接 \mV'mZ9>
cn.close(); |]aE<`D
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection KyzFnVH3)
e'=MQ,EWd
可滚动、更新的记录集 C-Ht(x |
1、创建可滚动、更新的Statement zkO<-w
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ei6AV1| p
该Statement取得的ResultSet就是可滚动的 h;-yU.(w
2、创建PreparedStatement时指定参数 q+[SbG&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F35#dIs`&
ResultSet.absolute(9000); 2^)1N>"g
批量更新 S6fL>'uQ
1、Statement ak:ibV
Statement sm = cn.createStatement(); 8
O 67
sm.addBatch(sql1); Qu7T[<
sm.addBatch(sql2); >P/][MT
... xY$iz)^0&
sm.executeBatch() @"o@}9=d
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 kWNV%RlSx
2、PreparedStatement &[At`Nw71
PreparedStatement ps = cn.preparedStatement(sql); 3 q`)*
{ SL,p36N
ps.setXXX(1,xxx); ;s~X
... P(;?kg}0
ps.addBatch(); VwEb7v,^0\
} -CRraEXf8
ps.executeBatch(); ,9P:Draxs`
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ixV0|P8,c
P|HKn,ar
事务的处理 i,|0@Vy
1、关闭Connection的自动提交 OQ,NOiNkap
cn.setAutoCommit(false); <ERB.d!
2、执行一系列sql语句 aDehqP6vf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @c~)W8
Statement sm ; RGK8'i/X
sm = cn.createStatement(insert into user...); Q6XRsFc
sm.executeUpdate(); a&k_=/X&
sm.close(); r%e KFS
sm = cn.createStatement("insert into corp...); XfKo A0
sm.executeUpdate(); kFQ8
y~>y}
sm.close(); z
Nl ,
3、提交 jZ%TJ0(H
cn.commit(); \tRG1&{$%
4、如果发生异常,那么回滚 e#B#B
cn.rollback();