java 数据库基本操作 v5;V$EGD&
1、java数据库操作基本流程 %0!!998
2、几个常用的重要技巧: I
;Sm<P7*
可滚动、更新的记录集 fSFb)+
批量更新 g",htYoEnj
事务处理 [~<X|_LG
'{?7\+o.x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 69$[yt>KYz
1、取得数据库连接 hln.EAW'Yc
1)用DriverManager取数据库连接 i#Y[I"'
例子 mew,S)dq!
String className,url,uid,pwd; 9c@."O`
className = "oracle.jdbc.driver.OracleDriver"; +bw>9VmG
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; LJAqk2k
uid = "system"; RrGFGn{
pwd = "manager"; Xo:!U=m/#
Class.forName(className); 0qj:v"~Q
Connection cn = DriverManager.getConnection(url,uid,pwd); #r}O =izi
2)用jndi(java的命名和目录服务)方式 _3YuPMaN
例子 M3U*'A\
String jndi = "jdbc/db"; zFqlTUD`t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); VNcxST15a
DataSource ds = (DataSource) ctx.lookup(jndi); xQ=sZv^M
Connection cn = ds.getConnection(); AD=vYDR+
多用于jsp中 B~RVFc +
2、执行sql语句 jLRh/pbz4
1)用Statement来执行sql语句 [Grd?mc#
String sql; %|:Gn) 8
Statement sm = cn.createStatement(); OJGEX}3'
sm.executeQuery(sql); // 执行数据查询语句(select) `"/s," c:D
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); *+ql{\am4N
2)用PreparedStatement来执行sql语句 ?B"k9+%5ej
String sql; ""JTU6]MS
sql = "insert into user (id,name) values (?,?)"; R>iRnrn:-
PreparedStatement ps = cn.prepareStatement(sql); hv.$p5UY*
ps.setInt(1,xxx); \Y0o~JD
ps.setString(2,xxx); [%alnY
... '51 8S"T @
ResultSet rs = ps.executeQuery(); // 查询 axSJ:j8
int c = ps.executeUpdate(); // 更新 M[^
ueyz@{On~
3、处理执行结果 +;P8QZK6
查询语句,返回记录集ResultSet 75+#)hNa!P
更新语句,返回数字,表示该更新影响的记录数 KTm^0:V[Oy
ResultSet的方法 J.r^"K\
1、next(),将游标往后移动一行,如果成功返回true;否则返回false bZE;}d
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 vjcG
F'-
Pde|$!Jo
4、释放连接 2L<iIBSJwm
cn.close(); Be=J*D!E=>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection H<|ilL'fX
kf8-#Q/B
可滚动、更新的记录集
\~]HfDu
1、创建可滚动、更新的Statement Z-fQ{&a{
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); c&{1Z&Y
该Statement取得的ResultSet就是可滚动的 .K=r.tf~
2、创建PreparedStatement时指定参数 ?+]prbt)
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3~I|KF7x
ResultSet.absolute(9000); M?iU$qI
批量更新 BB?vc(d
1、Statement *ydkx\pT
Statement sm = cn.createStatement(); 7<<-\7`
sm.addBatch(sql1); mUmU_L u8
sm.addBatch(sql2); *v}8n95*2
... s[
ze8:
sm.executeBatch() )AxgKBW
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 F%t_9S,)O
2、PreparedStatement ADTx _tE
PreparedStatement ps = cn.preparedStatement(sql); /!l$Y?
{ b?p <y`
ps.setXXX(1,xxx); Uq:WW1=kh
... G% |$3
ps.addBatch(); eDh]uKg
} IMKyFp]h-
ps.executeBatch(); _(K )(&
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ZPktZ
6`>WO_<z
事务的处理 o7/S'Haxc]
1、关闭Connection的自动提交 E<j}"W$a
cn.setAutoCommit(false); p(jY2&g
2、执行一系列sql语句 /k$h2,O"*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close M.|cl#
Statement sm ; ,f4VV\
sm = cn.createStatement(insert into user...); S_E-H.d"
sm.executeUpdate(); 0Jz5i4B
sm.close(); *Kpk1
sm = cn.createStatement("insert into corp...); KW* 2'C&
sm.executeUpdate(); {`FkiB` i
sm.close(); SXYH#p
3、提交 yqEX0|V%
cn.commit(); X"4 :#s
4、如果发生异常,那么回滚 B-oQ 9[~
cn.rollback();