java 数据库基本操作 %iML??S
1、java数据库操作基本流程 A) .AAr
2、几个常用的重要技巧: rGO3
可滚动、更新的记录集 b(,[g>xH
批量更新 vDL/PXNC
事务处理 9t gkAU`
L*38T\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )HHzvGsL)
1、取得数据库连接 S]{Z_|h*j
1)用DriverManager取数据库连接 :@L5=2Z+
例子 [O'p&j@
String className,url,uid,pwd;
]YKWa"
className = "oracle.jdbc.driver.OracleDriver"; y->iv%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; h Nwb.[
uid = "system"; U3QnWPt}>
pwd = "manager"; O*7~t17
Class.forName(className); ;RYKqUE
Connection cn = DriverManager.getConnection(url,uid,pwd); C $;~=
2)用jndi(java的命名和目录服务)方式 EtG)2)
例子 1gr jK.x
String jndi = "jdbc/db"; gr7_oJ:R
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &0TheY;srf
DataSource ds = (DataSource) ctx.lookup(jndi); K!mgh7Dx
Connection cn = ds.getConnection(); ' ga2C\)
多用于jsp中 HBu>BSv:
2、执行sql语句 YG|T;/-
1)用Statement来执行sql语句 }Z=Qy;zk
String sql; pq`MO
.R
Statement sm = cn.createStatement(); ygHNAQG~
sm.executeQuery(sql); // 执行数据查询语句(select) ,fbO}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); w$_ooQ(_;Q
2)用PreparedStatement来执行sql语句 BTB,a$P/
String sql; JkTL+obu
sql = "insert into user (id,name) values (?,?)"; rz(DZ V
PreparedStatement ps = cn.prepareStatement(sql); d{Z
ps.setInt(1,xxx); 3JwmLGj}
ps.setString(2,xxx); '`n\YO.N
... ufmFeeg
ResultSet rs = ps.executeQuery(); // 查询 'sC{d&c
int c = ps.executeUpdate(); // 更新 'yl`0,3wV
SRMy#j-
3、处理执行结果 B; ~T|ex u
查询语句,返回记录集ResultSet z[B7k%}
更新语句,返回数字,表示该更新影响的记录数 YS9| J=!~
ResultSet的方法 &A>J>b
1、next(),将游标往后移动一行,如果成功返回true;否则返回false -1[ri8t;nV
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `ainJs:B
i^yQ;
2-
4、释放连接 w] VvH"?
cn.close(); OF)X(bi4j
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection fYpy5vc-dm
q^gd1K<N
可滚动、更新的记录集 8I*fPf
1、创建可滚动、更新的Statement x\lua
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); &"=inkh
该Statement取得的ResultSet就是可滚动的 v+Hu=RZE
2、创建PreparedStatement时指定参数 r*$KF!-dg
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %gN8-~$1
ResultSet.absolute(9000); mR@iGl\\
批量更新 Z# 1Qj9
1、Statement 'Z';$N ]
Statement sm = cn.createStatement(); ~Oolm_+{}
sm.addBatch(sql1); o9JJ_-O"
sm.addBatch(sql2); }a8N!g
... r3|vu"Uei
sm.executeBatch() r]TeR$NJ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 mIOx)`$
2、PreparedStatement 2e+DUZBoC
PreparedStatement ps = cn.preparedStatement(sql); |
r2'B
{ O*CKyW_$t
ps.setXXX(1,xxx); qk+:p]2
... `":< ]lj
ps.addBatch(); % 30&6 "
} ezFyd 'P
ps.executeBatch(); zdtzR<X
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {R(q7ALR
o +&/ N-t
事务的处理 T2k5\r8
1、关闭Connection的自动提交 }ZV$_
cn.setAutoCommit(false); 4!D!.t~r
2、执行一系列sql语句 a&j
H9
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g8^ $,
Statement sm ; qz?9:"~$C
sm = cn.createStatement(insert into user...); k9a-\UIMet
sm.executeUpdate(); VEJ Tw
sm.close(); *T 6<'a
sm = cn.createStatement("insert into corp...); vAX %i( 4
sm.executeUpdate(); @A
g=2\9
sm.close(); /|Zk$q.\
3、提交 R6!t2gdKe@
cn.commit(); +YXyfTa
4、如果发生异常,那么回滚 2: fSn&*/>
cn.rollback();