java 数据库基本操作 d?6\
1、java数据库操作基本流程 %4$J.6M
2、几个常用的重要技巧: lZ'ZL*
可滚动、更新的记录集 bJ!(co6t
批量更新 c3aBPig\D
事务处理 q1Sr#h|
dy"7Wl]hi7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9EFQo^
E
1、取得数据库连接 O\X=vh/D
1)用DriverManager取数据库连接 qu`F,OG
例子 r]3v.GZy
String className,url,uid,pwd; ]H-5
className = "oracle.jdbc.driver.OracleDriver"; (F+]h]KSi
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; zE8qU;
uid = "system"; |s!<vvp]
pwd = "manager"; 16-1&WuY@
Class.forName(className); !n^7&Y[N;
Connection cn = DriverManager.getConnection(url,uid,pwd); z(dDX%k@
2)用jndi(java的命名和目录服务)方式 nvInq2T1
例子 ,R$U(,>_0
String jndi = "jdbc/db"; \Dx5= Lh
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); GeFu_7u!|
DataSource ds = (DataSource) ctx.lookup(jndi); ;659E_y>
Connection cn = ds.getConnection(); hd>_K*oH
多用于jsp中 =WEWs4V5A
2、执行sql语句 TQL_K8k@_
1)用Statement来执行sql语句 P;bOtT --
String sql; p!/ *(TT
Statement sm = cn.createStatement(); .VA'W16
sm.executeQuery(sql); // 执行数据查询语句(select) Nm{J=`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -Pp =)_O
2)用PreparedStatement来执行sql语句 :"Gd;~p.
String sql; &=[N{N?(
sql = "insert into user (id,name) values (?,?)"; U6IvN@
g
PreparedStatement ps = cn.prepareStatement(sql); *r/o
\pyH
ps.setInt(1,xxx); SO+J5,)HA
ps.setString(2,xxx); :G4)edwe
... "ivSpec.V
ResultSet rs = ps.executeQuery(); // 查询 ]N^>>k
int c = ps.executeUpdate(); // 更新 (.~,I+Cz'
tSX,*cz
3、处理执行结果 Z}`A'#!
查询语句,返回记录集ResultSet z{(c-7*
更新语句,返回数字,表示该更新影响的记录数 M?v`C>j
ResultSet的方法 fO{'$?K
1、next(),将游标往后移动一行,如果成功返回true;否则返回false s*tzU.E(
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 OrRU$5Lo
-Gj."ks
4、释放连接 ,e@707d`\
cn.close(); v$~ZT_"(9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection c:u2a/Q?
1Q!^%{Y;
可滚动、更新的记录集 [pzo[0G 'v
1、创建可滚动、更新的Statement \=
G8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8,&pX ga
该Statement取得的ResultSet就是可滚动的 1$v1:6
2、创建PreparedStatement时指定参数 5e
>qBw8t
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 1#V&'A
ResultSet.absolute(9000); oTb4 T=
批量更新 4<A+Tf
1、Statement K!O7q~s[D
Statement sm = cn.createStatement(); &eFv~9
sm.addBatch(sql1); *n*po.Xr
sm.addBatch(sql2); nC@UK{tVa
... xG8z4Yu
sm.executeBatch() w1,6%?p(O
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ?UBhM,;XK
2、PreparedStatement &d 6
PreparedStatement ps = cn.preparedStatement(sql); +"3K)9H
{ %Hpz^<`
ps.setXXX(1,xxx); W~?mr!`
... t@+z r3
ps.addBatch(); 4>Y\Y$3
} Rf#t|MW*#
ps.executeBatch(); osPrr QoH
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :rnj>U6<>
s}Q*zy
事务的处理 v]U0@#/p
1、关闭Connection的自动提交 TIVrbO\!o
cn.setAutoCommit(false); mApl}I
2、执行一系列sql语句 q/dja
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close m<GJ1)%3i
Statement sm ; Nrfj[I
sm = cn.createStatement(insert into user...); ;hkzL_' E)
sm.executeUpdate(); !3Ed0h]Bfa
sm.close(); KB a
sm = cn.createStatement("insert into corp...); +7$zL;ph=n
sm.executeUpdate(); Qg5-I$0
sm.close(); P3+?gW'
3、提交 cE7IHQ
cn.commit(); N6uKFQL:{
4、如果发生异常,那么回滚 4L/8Hj#g
cn.rollback();