java 数据库基本操作 ^JDiI7
1、java数据库操作基本流程 6 u3$ .Q
2、几个常用的重要技巧: UuV<#N)
可滚动、更新的记录集 0n<t/74
批量更新 P|"U
事务处理 mUj=NRq
EM_`` 0^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 zh hHA9
1、取得数据库连接 YpFh_Zr[
1)用DriverManager取数据库连接 ^-CQ9r*
例子 5WR(jl+M
String className,url,uid,pwd; AZmABl
className = "oracle.jdbc.driver.OracleDriver"; Bn7~ p+N
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; VQ{.Ls2`Z
uid = "system"; GEg8\
pwd = "manager"; 9(%ptnya
Class.forName(className); &Rgy/1
Connection cn = DriverManager.getConnection(url,uid,pwd); Kvu0Av-7
2)用jndi(java的命名和目录服务)方式 kf3yJP/
例子 W$x'+t5H
String jndi = "jdbc/db"; a95QDz
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); QR!8 n
DataSource ds = (DataSource) ctx.lookup(jndi); bDLPA27
Connection cn = ds.getConnection(); 09Sy-
je*/
多用于jsp中 oG! S(95
2、执行sql语句 a@&^t( 1
1)用Statement来执行sql语句 * /S=9n0
String sql; ,0^:q)_
Statement sm = cn.createStatement(); LB<,(dyh
sm.executeQuery(sql); // 执行数据查询语句(select) l
vuoVINEp
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); WJG& `PP
2)用PreparedStatement来执行sql语句 L< MIl[z7
String sql; EJ*
sql = "insert into user (id,name) values (?,?)"; x,Im%!h
PreparedStatement ps = cn.prepareStatement(sql); PvzB, 2":
ps.setInt(1,xxx); *D: wwJ
ps.setString(2,xxx);
S[o_$@|
... q?x.P2
ResultSet rs = ps.executeQuery(); // 查询 +L4_]
int c = ps.executeUpdate(); // 更新 i,=CnZCh
c
k=
3、处理执行结果 mQQ5>0^m
查询语句,返回记录集ResultSet QdM&M^
更新语句,返回数字,表示该更新影响的记录数 kan?2x
ResultSet的方法 ^-3R+U- S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =sG9]a<I
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]M|Iy~
X
+jcg[|-'/
4、释放连接 q]%c
6{w
cn.close(); $]/a/!d
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .bh>_ W_h
:tu_@3bg-
可滚动、更新的记录集 DkP%1Crdr
1、创建可滚动、更新的Statement tlU&p'
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); hP4*S^l
该Statement取得的ResultSet就是可滚动的 G]fl33_}l
2、创建PreparedStatement时指定参数 lx<]v^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); tA+ c
ResultSet.absolute(9000); mZVYgJQ[
批量更新 }.<%46_Z-
1、Statement ]KMOLe6(
Statement sm = cn.createStatement(); hSmu"a,S
sm.addBatch(sql1); _"8\k7S*
sm.addBatch(sql2); 56Q9RU(M
... pq`Bg`c
sm.executeBatch() 8=^o2&
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 MtAD&+3$
2、PreparedStatement m/"\+Hv
PreparedStatement ps = cn.preparedStatement(sql); jI$}\*g
{ *
%p6+D-C
ps.setXXX(1,xxx); sF?N vp
... .7-Yu1{2
ps.addBatch(); f
Q.ea#xh^
} pIh%5ZU
ps.executeBatch(); uy~KJn?Tu
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [@@Ovv
s9 '*Vm
事务的处理 Cc:m~e6r
1、关闭Connection的自动提交 n237%LH[
cn.setAutoCommit(false); CErkmod{}e
2、执行一系列sql语句 J7R+|GTcx
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :F:<{]oG_
Statement sm ; ms'!E)
sm = cn.createStatement(insert into user...); 9?)r0`:#
sm.executeUpdate(); <$s G]l!\
sm.close(); v_*E:E
sm = cn.createStatement("insert into corp...); ".z~c%'
sm.executeUpdate(); YX+Da"\
sm.close(); /8baJ+D"4\
3、提交 S8+Xk= x
cn.commit(); Z']D8>d
4、如果发生异常,那么回滚 YcS}ug7
cn.rollback();