java 数据库基本操作 [X K^3pT_
1、java数据库操作基本流程 <r 2$k"*:
2、几个常用的重要技巧: ?wM{NVt#-
可滚动、更新的记录集 Msj(>U&}+
批量更新 Sep/N"7~t
事务处理 w)}' {]P"c
=^a Ngq
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (lPiv+'n
1、取得数据库连接 klpYtQ
1)用DriverManager取数据库连接 })~M}d2LXB
例子 miWog 8j
String className,url,uid,pwd; {vCB$@/o
className = "oracle.jdbc.driver.OracleDriver"; ;1x(~pD*o
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; v+\&8)W=
uid = "system"; Cn6<I {`\
pwd = "manager"; R^u 1(SF
Class.forName(className); 2z*EamF
Connection cn = DriverManager.getConnection(url,uid,pwd); #6okd*^
2)用jndi(java的命名和目录服务)方式 f8ucJ.{"
例子 +%E)]*Ym
String jndi = "jdbc/db"; {v3?.a$u
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); P_e9>t@
DataSource ds = (DataSource) ctx.lookup(jndi); hbfN1"z
Connection cn = ds.getConnection(); Tfsx&k\
多用于jsp中 Lt'FA
2、执行sql语句 +UvT;"
1)用Statement来执行sql语句 /:S&1'=
String sql; 2Kg-ZDK8
Statement sm = cn.createStatement(); p;nRxi7'
sm.executeQuery(sql); // 执行数据查询语句(select) nulLK28q
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 3UXaA;
2)用PreparedStatement来执行sql语句 7LotN6H
String sql; b{
M'aV
sql = "insert into user (id,name) values (?,?)"; $W_sIS0\z
PreparedStatement ps = cn.prepareStatement(sql); Tj(DdR#w
ps.setInt(1,xxx); _z6_mmMp
ps.setString(2,xxx); (AIgW
... Ec2?'*s
ResultSet rs = ps.executeQuery(); // 查询 :X+!W_xR
int c = ps.executeUpdate(); // 更新 PCqE9B)l
#/"?.Z;SSH
3、处理执行结果 {KQ]"a 6
查询语句,返回记录集ResultSet 85e!)I_
更新语句,返回数字,表示该更新影响的记录数 {pJf~
ResultSet的方法 v?6g.
[;?
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {wK|C<K
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 czG]rl\1
yxx9h3
4、释放连接 |[+/ ]Y
cn.close(); e-E0Bp
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ~7;AV(\%e
J?y0RX
可滚动、更新的记录集 Xzn}gH]
1、创建可滚动、更新的Statement bz'#YM
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *@+E82D
该Statement取得的ResultSet就是可滚动的 Z@1vJH6IbA
2、创建PreparedStatement时指定参数 lEXER^6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Mp-hNO}.Z
ResultSet.absolute(9000); wf` e3S
批量更新 Y'&rSHI"
1、Statement /^M|$JRI
Statement sm = cn.createStatement(); {e]ktj#+{
sm.addBatch(sql1); ;N(9nX}%)
sm.addBatch(sql2); 7gnrLc$]O
... ;ElwF&"!X
sm.executeBatch() n[E/O}3& /
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 bI?uV;m>
2、PreparedStatement HI\V29
a
PreparedStatement ps = cn.preparedStatement(sql); ;0"p)O@s04
{ tX.fbL@T
ps.setXXX(1,xxx); lnQfpa8j
... l$:?82{
ps.addBatch(); ^.gBHZ
} UlD]!5NO
ps.executeBatch();
I?R?rW
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 `fM]3]x>
E7`Q=4@e
事务的处理 goje4;
1、关闭Connection的自动提交 k1_"}B5
cn.setAutoCommit(false); *S= c0
2、执行一系列sql语句 VRQD
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close LW#$%}
Statement sm ; A7enC,Ey
sm = cn.createStatement(insert into user...); ^| r6>b
sm.executeUpdate(); Eb~e=){
sm.close(); {lO>i&mx
sm = cn.createStatement("insert into corp...); XF Cwa
sm.executeUpdate(); 9%iv?/o*L
sm.close(); cOoF +hz0O
3、提交 H"b}lf
cn.commit(); +@mgb4_
4、如果发生异常,那么回滚 *|*6q/
cn.rollback();