java 数据库基本操作 XdxSi"+
1、java数据库操作基本流程 <P1yA>=3`
2、几个常用的重要技巧: Th>ff)~e
可滚动、更新的记录集 G"|`&r@
批量更新 %$CV?K$C
事务处理 K)[DA*W
%{HeXe
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 DA wUG
1、取得数据库连接 8*Ke;X~N
1)用DriverManager取数据库连接 |g,99YIv>
例子 &Y3r'"
String className,url,uid,pwd; OT{cP3;0*o
className = "oracle.jdbc.driver.OracleDriver"; !ZrU@T
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; hX9vtV5L
uid = "system"; H^r;,Q$9
pwd = "manager"; JOFQyhY0>m
Class.forName(className); S@Q4fmH
Connection cn = DriverManager.getConnection(url,uid,pwd); #)PAvBJ;m
2)用jndi(java的命名和目录服务)方式 >JckN4v
例子 5l[&-:(Lh
String jndi = "jdbc/db"; ,Vr-E
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); zqt{oN_
DataSource ds = (DataSource) ctx.lookup(jndi); Sahz*f
Connection cn = ds.getConnection(); ptMDhMVW
多用于jsp中 e-Ma8+X\
2、执行sql语句 %"CF-K@th
1)用Statement来执行sql语句 e
.1!
K
String sql; ,,HoD~]rd
Statement sm = cn.createStatement();
&-zW1wf
sm.executeQuery(sql); // 执行数据查询语句(select) BOdd~f%&tn
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); OD;F{Hc
2)用PreparedStatement来执行sql语句 {DWL 5V#M
String sql; &UfP8GE9
sql = "insert into user (id,name) values (?,?)"; RBOg;EJ
PreparedStatement ps = cn.prepareStatement(sql); PB(I3R9
ps.setInt(1,xxx); ^Cy=L]
ps.setString(2,xxx); @
q:S]YB
... &5d~ODO
ResultSet rs = ps.executeQuery(); // 查询 It:,8
int c = ps.executeUpdate(); // 更新 6%L#FSI
4U>g0
3、处理执行结果 ^bk:g}o
查询语句,返回记录集ResultSet Fv$oXg/
更新语句,返回数字,表示该更新影响的记录数 BHN EP |=
ResultSet的方法 MmQ"z_v
1、next(),将游标往后移动一行,如果成功返回true;否则返回false k$3Iv"gbx
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Cm%|hk>fQ
,4--3 MU
4、释放连接 #sM`>KG6T1
cn.close(); / ?Hq
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection x@#aOf4<U
zw[ #B #
可滚动、更新的记录集 as3*49^9
1、创建可滚动、更新的Statement ;:obg/;uJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); jG["#5<?
该Statement取得的ResultSet就是可滚动的 8@,8j!$8G
2、创建PreparedStatement时指定参数 H;{IOBo
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); IN7Cpg~9%
ResultSet.absolute(9000); P"f4`q
批量更新 %sCG}?
y
1、Statement sWv!ig_
Statement sm = cn.createStatement(); sZPyEIXie
sm.addBatch(sql1); 9%Qlg4~<s
sm.addBatch(sql2); V
`7(75
... ~yiw{:\
sm.executeBatch() _lrvK99
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 crQ_@@X?<
2、PreparedStatement wA\a ]X.
PreparedStatement ps = cn.preparedStatement(sql); fUq:`#Q
{ J_ 7#UjGA,
ps.setXXX(1,xxx); 3HqTVq`&
... pv8vW'G\E
ps.addBatch(); 8_/,`}9
} ;a 6Z=LB
ps.executeBatch(); [*U.bRs
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 L<k(stx~
46U*70
事务的处理 RQYD#4|
1、关闭Connection的自动提交 V 5D8z
cn.setAutoCommit(false); QjOY1Xze
2、执行一系列sql语句 sB8v:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close lk.Mc6)
Statement sm ; bT15jNa
sm = cn.createStatement(insert into user...); u0F{.fe
sm.executeUpdate(); MO%+rf0~w
sm.close(); w8cbhc
sm = cn.createStatement("insert into corp...); 089v;
d 6
sm.executeUpdate(); 'U-8w@\Z
sm.close(); _%G;^ b
3、提交
~S\8 '
cn.commit(); .z[#j]k
4、如果发生异常,那么回滚 y({lE3P
cn.rollback();