java 数据库基本操作 x):cirwkl
1、java数据库操作基本流程 ^AK<]r<?L?
2、几个常用的重要技巧: Juj"cjob
可滚动、更新的记录集 HDZB)'I
批量更新 K O "U5v
事务处理 l=U@j
T
uyMxBc%6
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 R)d1]k8
1、取得数据库连接 DVt;I$
1)用DriverManager取数据库连接 XRCiv
例子 s~$ZTzV
String className,url,uid,pwd; fOCLN$x^
className = "oracle.jdbc.driver.OracleDriver"; 6lOT5C eJ"
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (:Rj:8{
uid = "system"; nS)U+q-x&o
pwd = "manager"; &{NN!X
Class.forName(className); Yo3my>N&g
Connection cn = DriverManager.getConnection(url,uid,pwd); _Q,`Qn@|BD
2)用jndi(java的命名和目录服务)方式 Ac}+Uq
例子 A#$oY{" 2Y
String jndi = "jdbc/db"; ec+&K?T
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); u )PB@
DataSource ds = (DataSource) ctx.lookup(jndi); T Z{';oU
Connection cn = ds.getConnection(); NpqMdd
多用于jsp中 \,)('tUE
2、执行sql语句 F7lhLly
1)用Statement来执行sql语句 @S\!wjl]C
String sql; OjTb2[Q
Statement sm = cn.createStatement(); p;cNmMm
sm.executeQuery(sql); // 执行数据查询语句(select) <VI.A" Qk~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); +U{8Mj
2)用PreparedStatement来执行sql语句 }M-^A{C\%
String sql; ?aOx
b
sql = "insert into user (id,name) values (?,?)"; Uo?g@D
PreparedStatement ps = cn.prepareStatement(sql); &SuWmtq
ps.setInt(1,xxx); 69ZGdN
ps.setString(2,xxx); ]R[j]E.
... 4{4VC"fa
ResultSet rs = ps.executeQuery(); // 查询 "j-Z<F]]
int c = ps.executeUpdate(); // 更新 {7swE(N
"=<T8M
3、处理执行结果 0N.B=j|
查询语句,返回记录集ResultSet ScOiOz:Ha
更新语句,返回数字,表示该更新影响的记录数 =y+gS%o$
ResultSet的方法 & -L$B
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ug(;\*yg
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zA/tHlKc
N?7MYP
4、释放连接
%f3qCN
cn.close();
K|[p4*6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 0?c2=Y
ZNWo:N8;
可滚动、更新的记录集 q,S[[{("
1、创建可滚动、更新的Statement Lv;% z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6L5j
该Statement取得的ResultSet就是可滚动的 4z6i{n-k
2、创建PreparedStatement时指定参数 _v=S4A#tF
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); k*XI/k5Vc
ResultSet.absolute(9000); b,C2(?hg
批量更新 O_=2{k~s0
1、Statement K9-;-{qb
Statement sm = cn.createStatement(); AzFd#P
sm.addBatch(sql1); 8(d Hn
sm.addBatch(sql2); 0QJ
:
... DpD19)ouy
sm.executeBatch() :c75*h`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 rdj_3Utv
2、PreparedStatement fv@mA --
PreparedStatement ps = cn.preparedStatement(sql); 3an9Rb V
{ YA+jLy6ZL
ps.setXXX(1,xxx); 9ZXkuP9vm
... \vg(@)$q
ps.addBatch(); ;IV
} LAs#g||M
ps.executeBatch(); @6["A'h
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 4)Jtc2z7Z\
c_V^~hq
事务的处理 j8P qc]
1、关闭Connection的自动提交 CG#lpAs
cn.setAutoCommit(false); srS2v\1:
2、执行一系列sql语句 rF@njw@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 8Dy5g
Statement sm ; VrQgn9L
sm = cn.createStatement(insert into user...); _PPZ!r(
sm.executeUpdate(); l<3X:)
sm.close(); Zc!rL0T
sm = cn.createStatement("insert into corp...); Tumv0=q4wd
sm.executeUpdate(); )wZ;}O
sm.close(); IvZ,|R?
3、提交 `GDWy^-Q+!
cn.commit(); 5&
2([
4、如果发生异常,那么回滚 {UeS_O>(
cn.rollback();