java 数据库基本操作
hZ ve8J
1、java数据库操作基本流程 =/J{>S>(i
2、几个常用的重要技巧: (")IU{>c6
可滚动、更新的记录集 9mEt**s
Ur
批量更新 ^s_BY+#
事务处理 ;c!}'2>vM
,1}c% C*,Q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 F"k.1.
1、取得数据库连接 ?Z]5
[
1)用DriverManager取数据库连接 |@a.dgz,
例子 /i${ [1
String className,url,uid,pwd; p%8v+9+h2
className = "oracle.jdbc.driver.OracleDriver"; h*2NFL~#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -f+U:/'.>v
uid = "system"; m|}};8
pwd = "manager"; :UMtknV
Class.forName(className); oY#62&wk4
Connection cn = DriverManager.getConnection(url,uid,pwd); M+mO4q6
2)用jndi(java的命名和目录服务)方式 d'4^c,d
例子 eiNF?](3O
String jndi = "jdbc/db"; _wC4n }J
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); H1alf_(_
\
DataSource ds = (DataSource) ctx.lookup(jndi); yO7xAb
Connection cn = ds.getConnection(); iL%Q@!ka
多用于jsp中 m3cO{
1I
2、执行sql语句 23F<f+2S
1)用Statement来执行sql语句 01 vEt
String sql; J(%Jg
Statement sm = cn.createStatement(); 9
2e?v8
sm.executeQuery(sql); // 执行数据查询语句(select) Od?M4Ed(
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Hkcr+BQ
2)用PreparedStatement来执行sql语句 w
A0$d
String sql; kFJ sB,2-
sql = "insert into user (id,name) values (?,?)"; IwE{Zvr
PreparedStatement ps = cn.prepareStatement(sql); ]7*Z'E
ps.setInt(1,xxx); lO Rym:P
ps.setString(2,xxx); ^sWsP` DV
... qM."W=XVN
ResultSet rs = ps.executeQuery(); // 查询
~s
:Ml
int c = ps.executeUpdate(); // 更新 DQ<{FN
8hTtBa
3、处理执行结果 VI}.MnCa
查询语句,返回记录集ResultSet Ux<2!vh
更新语句,返回数字,表示该更新影响的记录数 tAPr4n!
ResultSet的方法 (&=<UGY(w
1、next(),将游标往后移动一行,如果成功返回true;否则返回false #~
:j< =o
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9WJS.\G^
DPU%4te
4、释放连接 !zhg3B#p
cn.close(); )CYm/dk
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection )4[Yplo
Z/|oCwR
可滚动、更新的记录集 M!{;:m28X!
1、创建可滚动、更新的Statement O3?3XB> <
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); hU:M]O0uw
该Statement取得的ResultSet就是可滚动的 RjII(4Et
2、创建PreparedStatement时指定参数 j2UiZLuV
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); bVB_KE
ResultSet.absolute(9000); y5td o'Ex
批量更新 sd@JQ%O
1、Statement 2WP73:'t
Statement sm = cn.createStatement(); i.|zKjF'
sm.addBatch(sql1); '^TQ Ubw
sm.addBatch(sql2); y?ps+ce93
... OZ/P@`kN.f
sm.executeBatch() {Z529Ns
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :GXD-6}^|
2、PreparedStatement (BB&ZUdyv
PreparedStatement ps = cn.preparedStatement(sql); #B;~i6h]
{ kl0!*j
ps.setXXX(1,xxx); ;3nR_6\
... q'07
ps.addBatch(); )zFPf]gz
} &8l"Dl
ps.executeBatch(); n/
\{}9
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,qx;kJJ
B,@<60u
事务的处理 _TB,2 R
1、关闭Connection的自动提交 _K4Igq
cn.setAutoCommit(false); d)G'y
2、执行一系列sql语句 g UfLw
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close nLA8Hy"8z
Statement sm ; %n^jho5
sm = cn.createStatement(insert into user...); /M:R|91:_
sm.executeUpdate(); %0>DjzYt
sm.close(); $ BEIG@qG
sm = cn.createStatement("insert into corp...); e{ce
\
sm.executeUpdate(); EFb1Y{u^\!
sm.close(); ,a:!"Z^f
3、提交 \S[7-:Lu^
cn.commit(); N36<EHq
4、如果发生异常,那么回滚 20 j9~+
cn.rollback();