java 数据库基本操作 !~F oy F
1、java数据库操作基本流程 8'3&z-
2、几个常用的重要技巧: Ho/tCU|w
可滚动、更新的记录集 O\;Lb[`lb
批量更新 3HP
{
a
事务处理 _a"|
:kX
CiHx.5TiC
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 mP15PZ
1、取得数据库连接 "N&ix*($
1)用DriverManager取数据库连接 rttKj{7E
例子 .^F&6'h1H
String className,url,uid,pwd; F:<+}{Av
className = "oracle.jdbc.driver.OracleDriver"; +U,t*U4,
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; B&59c*K
uid = "system"; .@mZG<vg
pwd = "manager"; yCkWuU9
Class.forName(className); "
@""
Connection cn = DriverManager.getConnection(url,uid,pwd); n@bkZ/G
2)用jndi(java的命名和目录服务)方式 SV ~QH&0'
例子 hTby:$aCg
String jndi = "jdbc/db"; n 78!]O
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]CS
N7Q+l
DataSource ds = (DataSource) ctx.lookup(jndi); GpXf).a@
Connection cn = ds.getConnection(); Pk5\v0vkg
多用于jsp中 5)k/4l '
2、执行sql语句 {nA+-=T
1)用Statement来执行sql语句 MGwXZ7?E
String sql; 30Q77,Nsny
Statement sm = cn.createStatement(); x3Fn'+
sm.executeQuery(sql); // 执行数据查询语句(select) AoxORPp'
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); l&] %APL
2)用PreparedStatement来执行sql语句 +ZE"pA^C
String sql; 5c%Fb:BW=
sql = "insert into user (id,name) values (?,?)"; )Rk(gd
PreparedStatement ps = cn.prepareStatement(sql); T DPQ+Kg_
ps.setInt(1,xxx); 1#>uqUxah
ps.setString(2,xxx); eK3d_bF+
... :u@ w;
ResultSet rs = ps.executeQuery(); // 查询 <Z~Nz>'r
int c = ps.executeUpdate(); // 更新
8rU| Oh
LG(" <CU
3、处理执行结果 HPO:aGU
查询语句,返回记录集ResultSet >K%+h)%kI
更新语句,返回数字,表示该更新影响的记录数 rO1N@kd/
ResultSet的方法 @Y9tkJIt
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Jl6biJx
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
G}WY0FC6
0Y~5|OXJ
4、释放连接 11A;z[Zk
cn.close(); E`wq`g`H<
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection PP_ar{|7
6k37RpgH
可滚动、更新的记录集 KlwBoC/{K
1、创建可滚动、更新的Statement Fb{HiU9<!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); raP9rEs
该Statement取得的ResultSet就是可滚动的 -gb@BIV#
2、创建PreparedStatement时指定参数 !.|A}8nK
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -7I%^u
ResultSet.absolute(9000); J]NMqiq
批量更新 _*t75e$-
1、Statement H5gcP11r
Statement sm = cn.createStatement(); xWWVU}fd1
sm.addBatch(sql1); `Z2-<:]6&a
sm.addBatch(sql2); ronZa0
... E.x<J.[Y
sm.executeBatch() `P;3,@
e
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 =$kSn\L,
2、PreparedStatement ~>%% kQt
PreparedStatement ps = cn.preparedStatement(sql); cS#| _
{ >(W t
ps.setXXX(1,xxx); [/J(E\9
... 6* tky;
ps.addBatch(); 7u%OYt
D E
} /)Weg1b
ps.executeBatch(); _#<7s`i
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 (gutDUO;
f_. 0 uM
事务的处理 #Y'ub
5s
1、关闭Connection的自动提交 d&DQ8Gm ^
cn.setAutoCommit(false); Hv
=7+O$
2、执行一系列sql语句 #J$z0%P
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |A)a
='Ap
Statement sm ; ~\O,#j`_
sm = cn.createStatement(insert into user...); 'L%)B-,n
sm.executeUpdate(); c#fSt}J>C
sm.close(); Ee$F]NA
sm = cn.createStatement("insert into corp...); Sjmq\A88dc
sm.executeUpdate(); ,YrPwdaTB
sm.close(); !3*%-8bp
3、提交 2<_|1%C
cn.commit(); X&%;(`
4、如果发生异常,那么回滚 gYw=Z_z
cn.rollback();