java 数据库基本操作 E
y1mlW
1、java数据库操作基本流程 +;c)GNQ)6:
2、几个常用的重要技巧: KS!mzq-
可滚动、更新的记录集 BD&JbH!(
批量更新 3V?JX5X\
事务处理 ]{jdar^
1\z5[
_
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 1.+0=M[h
1、取得数据库连接 Di5eD,N
1)用DriverManager取数据库连接 dZFf/BXU
例子 qZ'&zB)
String className,url,uid,pwd; c~3OK_k
className = "oracle.jdbc.driver.OracleDriver"; V2Q2(yvdJ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; sWX iY
uid = "system"; ]R32dI8N
pwd = "manager"; {u{n b3/jl
Class.forName(className); X=USQj\A
Connection cn = DriverManager.getConnection(url,uid,pwd); 2 DJs'"8
2)用jndi(java的命名和目录服务)方式 7m~.V[l1
例子 \XFF(
String jndi = "jdbc/db"; +)k%jIi!
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); =e=sK'NvD
DataSource ds = (DataSource) ctx.lookup(jndi); 3.Z}2F]
Connection cn = ds.getConnection(); @d:TAwOI'
多用于jsp中 #!wu}nDu
2、执行sql语句 qPDe;$J)
1)用Statement来执行sql语句 }enm#0Ha
String sql; PN:/lIO
Statement sm = cn.createStatement(); H:Y?(" k
sm.executeQuery(sql); // 执行数据查询语句(select) @W[`^jfQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); f]W$4f{
2)用PreparedStatement来执行sql语句 %ZF47P%6
String sql; [v( \y
sql = "insert into user (id,name) values (?,?)"; Q '/v-bd?o
PreparedStatement ps = cn.prepareStatement(sql); /FJ )gQYA
ps.setInt(1,xxx); Aj((tMJNOw
ps.setString(2,xxx); {&nL'R
... uDvZ]Q|.
ResultSet rs = ps.executeQuery(); // 查询 ~,3+]ts='\
int c = ps.executeUpdate(); // 更新 o *)>aw
L}5nq@Uu)
3、处理执行结果 .xo#rt9_"=
查询语句,返回记录集ResultSet LfOXgn\
更新语句,返回数字,表示该更新影响的记录数 B*!{LjXV
ResultSet的方法 o9&1Ct
1、next(),将游标往后移动一行,如果成功返回true;否则返回false hC2 @Gq
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ! eXDN
LlOUK2tZ
4、释放连接 8MqKS}\H
cn.close(); J:LwO
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection n`gW&5,,z
)F*;7]f
可滚动、更新的记录集 ~3bH2,{L[
1、创建可滚动、更新的Statement ~iI4v#0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); q;a"M7
该Statement取得的ResultSet就是可滚动的 YaU)66=u
2、创建PreparedStatement时指定参数 Ox9WH4E
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); l&}3M
ResultSet.absolute(9000); CzDJbvv]
批量更新 8-]\C
1、Statement ZmU7 tK
Statement sm = cn.createStatement(); uvC ![j^~
sm.addBatch(sql1); n=Qz7N(M
sm.addBatch(sql2); !o +[L
... 6/e+=W2
sm.executeBatch() +PT/pybA
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6?8x[l*5M
2、PreparedStatement {[&$W8Li
PreparedStatement ps = cn.preparedStatement(sql); U0>Uqk",
{ K;j}qJvsb
ps.setXXX(1,xxx); -=5]B ;
... 0*$? =E
ps.addBatch(); Q#!|h:K
} T6_LiB@
ps.executeBatch(); PCKgdh},
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Zw6UH;5
[C_Dv-d
事务的处理 mz)Z
=`hy
1、关闭Connection的自动提交 9?W!E_
cn.setAutoCommit(false); /WqiGkHV*
2、执行一系列sql语句 LWwWxerZ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close X|]&K
Statement sm ; {Aq2}sRl{
sm = cn.createStatement(insert into user...); ))Q3;mI"
sm.executeUpdate(); K`%{(^}.
sm.close(); C.su<B?
sm = cn.createStatement("insert into corp...); ,Hq*zc c
sm.executeUpdate(); cvSr><(
sm.close(); Qn0 1ig
3、提交 (rF XzCI
cn.commit(); `wrN$&
4、如果发生异常,那么回滚 +2Xq+P
cn.rollback();