java 数据库基本操作 :g][99
1、java数据库操作基本流程 3Y>!e#
2、几个常用的重要技巧: ETYw
可滚动、更新的记录集 O%rjY
批量更新 htIV`_<Ro
事务处理 RF qbwPX
U#YM)8;Iz
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ni9/7
1、取得数据库连接 U*)pUJ{&t
1)用DriverManager取数据库连接 N'TL &]
例子 2LXy$[)7
String className,url,uid,pwd; ny{|{a
className = "oracle.jdbc.driver.OracleDriver"; qRTy}FU1
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; T'FRnC^~
uid = "system"; iQ:]1H s
pwd = "manager"; f\1)BZ'I
Class.forName(className); nd-y`@z
Connection cn = DriverManager.getConnection(url,uid,pwd); %|4Nmf$:Og
2)用jndi(java的命名和目录服务)方式 ?FD^S~bz-
例子 {]`O $S
String jndi = "jdbc/db"; K
o,O!T.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); X5=Dc+
DataSource ds = (DataSource) ctx.lookup(jndi); ]5B5J
Connection cn = ds.getConnection(); k|1/gd5
多用于jsp中 1H%LUA
2、执行sql语句 5v8_ji#l[
1)用Statement来执行sql语句 |_Z(}%
<o
String sql; MH1??vW
Statement sm = cn.createStatement(); uTngDk
sm.executeQuery(sql); // 执行数据查询语句(select) (J5E]NV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =ejkE;
%L
2)用PreparedStatement来执行sql语句 @"];\E$sI
String sql; vTN$SgzfCU
sql = "insert into user (id,name) values (?,?)"; 8IbHDDS
PreparedStatement ps = cn.prepareStatement(sql); gTm[ <Y
ps.setInt(1,xxx); a3JG&6-
ps.setString(2,xxx); !fjDO!,!
... Kh}#At^C8e
ResultSet rs = ps.executeQuery(); // 查询 5^*I]5t8
int c = ps.executeUpdate(); // 更新 Y@F@k(lOo
c:M~!CXO
3、处理执行结果 cV=h8F
查询语句,返回记录集ResultSet (m25ZhW
更新语句,返回数字,表示该更新影响的记录数 G-xW&wC-
ResultSet的方法 u05Zg*.[
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ?(4=:o
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 yY[N\*P
cd#@"&r
4、释放连接 o{lR_
cn.close(); g7rn|<6FI
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection hr(E,TAe
{|bf`
可滚动、更新的记录集 NvQN
1、创建可滚动、更新的Statement 7vubkj&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); K#kU6/
该Statement取得的ResultSet就是可滚动的 |-%[Z
2、创建PreparedStatement时指定参数
C65(
m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); *6?h,Dt L
ResultSet.absolute(9000); GBVw6+(c
批量更新 rgJKXl;@s
1、Statement ]^$3S
Statement sm = cn.createStatement(); 3a_~18W
sm.addBatch(sql1); ZG"_M@S.
sm.addBatch(sql2); 5L'X3g
... t32
FNg
sm.executeBatch() +QGZ2_vW
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2c
LIz@
2、PreparedStatement R#DnV[!\
PreparedStatement ps = cn.preparedStatement(sql); tU.Y$%4
{ 7='lu;=,
ps.setXXX(1,xxx); M3!A?!BU
... |9Q4VY'";
ps.addBatch(); }vgeQh-G
} uzr(gFd
ps.executeBatch(); TFjb1a,)
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 %77v'Pz1
[< Bk% B5
事务的处理 ]nY,%XE
1、关闭Connection的自动提交 Qo+I98LX[
cn.setAutoCommit(false); h(l4\)
2、执行一系列sql语句 ]yiwdQ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2x<,R/}
Statement sm ; e3oHe1"hP
sm = cn.createStatement(insert into user...); Bf1,(^3XH
sm.executeUpdate(); %\IB_M
sm.close(); %F_)!M;x
sm = cn.createStatement("insert into corp...); B>hf|.GI
sm.executeUpdate(); 50q(8F-N
sm.close(); rozp
3、提交 m-Z<zEQ
cn.commit(); o'O;69D]tX
4、如果发生异常,那么回滚 7&;M"?m&
cn.rollback();