java 数据库基本操作 -mG`* 0
1、java数据库操作基本流程 F=1 #qo<?
2、几个常用的重要技巧: 1(IZ,*i
可滚动、更新的记录集 T>rmm7F
批量更新 V@#oQi*
事务处理 PDuBf&/e
%
_E?3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~o"=4q`>
1、取得数据库连接 8{2
1)用DriverManager取数据库连接 o9"?z
例子 U{M3QOF
String className,url,uid,pwd; @=dv[P"jn
className = "oracle.jdbc.driver.OracleDriver"; x0(bM g>7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 2(@2z[eKr
uid = "system"; A?!RF7v
pwd = "manager"; 6{1=3.CL
Class.forName(className); {> msE }L
Connection cn = DriverManager.getConnection(url,uid,pwd); ; /K6U
2)用jndi(java的命名和目录服务)方式 #YE?&5t
例子 I@/
G#3Zr
String jndi = "jdbc/db"; A`f"<W-m
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8TeOh1\
DataSource ds = (DataSource) ctx.lookup(jndi); ,mp<<%{u
Connection cn = ds.getConnection(); $$1t4=Pz
多用于jsp中 "}*D,[C5e
2、执行sql语句 wb?k
1)用Statement来执行sql语句 ge
GhM>G
String sql; [=q/f2_1.
Statement sm = cn.createStatement(); eQu(3 sYb
sm.executeQuery(sql); // 执行数据查询语句(select) j2_j5Hgo
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); X%IqZ{{
2)用PreparedStatement来执行sql语句 -GPJ,S V>
String sql; Nyy&'\`!
sql = "insert into user (id,name) values (?,?)"; jo<xrn\
PreparedStatement ps = cn.prepareStatement(sql); HC6U_d1-6
ps.setInt(1,xxx); EXr2d"
ps.setString(2,xxx); Nb&j?./
... 3U{
mC}F
ResultSet rs = ps.executeQuery(); // 查询 >U{iof<
int c = ps.executeUpdate(); // 更新 ',0:/jSz
m.Zy$SDj(
3、处理执行结果 y2#>a8SRS
查询语句,返回记录集ResultSet nJN-U+)u
更新语句,返回数字,表示该更新影响的记录数 dnoF)(d&Cm
ResultSet的方法 K!&W} _@l
1、next(),将游标往后移动一行,如果成功返回true;否则返回false z0<E3t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Gd%i?(U,R
1~L;S
4、释放连接 fOHbgnL>
cn.close(); &`l\Q\_[@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection B&6NjLV
g&xj(SMj-$
可滚动、更新的记录集 @9HRGxJ=}
1、创建可滚动、更新的Statement :
"|/
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); fc*>ky.v
该Statement取得的ResultSet就是可滚动的 1 #,4P1"
2、创建PreparedStatement时指定参数 rx gSQ+G_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $lf/Mg_H
ResultSet.absolute(9000); <}{<FXk[
批量更新 c#{lXS^
1、Statement =6Ok4Z
Statement sm = cn.createStatement(); H}F
UgA;
sm.addBatch(sql1); \+R %KA/F
sm.addBatch(sql2); :$b` n
... vF$(
Y/
sm.executeBatch() N<:c*X
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 -K=.A*}
2、PreparedStatement \DQu!l@1U
PreparedStatement ps = cn.preparedStatement(sql); <
bC'.m
{ .Q!d[vL
ps.setXXX(1,xxx); 0>BxS9?w
... Z&Ob,Ru
ps.addBatch(); 1]Xx{j<
} IAH"vHM
ps.executeBatch(); }S uj=oFp
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8j#S+=l>
1DB{"8ov
事务的处理 V
,p~,rC
1、关闭Connection的自动提交 ^Qx?)(@
cn.setAutoCommit(false); U 3a2wK
2、执行一系列sql语句 q8d](MaX
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Ow/,pC >V
Statement sm ; +fXwbZ?p
sm = cn.createStatement(insert into user...); f-|?He4O]
sm.executeUpdate(); KBB)xez8
sm.close(); e^O:I
sm = cn.createStatement("insert into corp...); F;ttqL
sm.executeUpdate(); x*vD^1"'P
sm.close(); ~ps,U
3、提交 'r]6 GC8Z$
cn.commit(); Z8$BgP
4、如果发生异常,那么回滚 (uvQ/!
cn.rollback();