java 数据库基本操作 iX
(<ozH
1、java数据库操作基本流程 ' m^nKG$"
2、几个常用的重要技巧: 9eR4?^(3!
可滚动、更新的记录集 M it3q
批量更新 FglW|Hwy
事务处理 ]40@yrc
CmP_9M?ce
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Q^trKw~XNy
1、取得数据库连接 rHngYcjR
1)用DriverManager取数据库连接 ?E +[
例子 Fw.df<
String className,url,uid,pwd; mQd
L"caA
className = "oracle.jdbc.driver.OracleDriver"; FqwH:Fcr:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; K)DpC* j
uid = "system"; I.dS-)Y
pwd = "manager"; {$AwG#kt
Class.forName(className);
@'IRh9
Connection cn = DriverManager.getConnection(url,uid,pwd); k7ye,_&>
2)用jndi(java的命名和目录服务)方式 9 ^+8b9y
例子 dBRK6hFC
String jndi = "jdbc/db"; Bl$Hg,in-
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); "($"T v2
DataSource ds = (DataSource) ctx.lookup(jndi); ;+;%s D
Connection cn = ds.getConnection(); P z<
\q;
多用于jsp中 "WF@T
2、执行sql语句 (Y!{ UNq5
1)用Statement来执行sql语句 +YD_ L
String sql; G1tua"Px
Statement sm = cn.createStatement(); +%sMd]$,n
sm.executeQuery(sql); // 执行数据查询语句(select) /Pv
dP#!
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); CNMcQP
2)用PreparedStatement来执行sql语句 ){}1u ?
String sql; H6/n
sql = "insert into user (id,name) values (?,?)"; 0Ba*"/U]t~
PreparedStatement ps = cn.prepareStatement(sql); SB
x<-^
ps.setInt(1,xxx); ks19e>'5Q
ps.setString(2,xxx); 'Bx"i
... ,::f?
Gc7j
ResultSet rs = ps.executeQuery(); // 查询 qe[P'\]L
int c = ps.executeUpdate(); // 更新 H3#rFO"C*
?Z(xu~^/
3、处理执行结果 fug
Fk
查询语句,返回记录集ResultSet Gg TrIF
更新语句,返回数字,表示该更新影响的记录数 Ht4A
ResultSet的方法 6N<
snBmd
1、next(),将游标往后移动一行,如果成功返回true;否则返回false r}nz )=\Cj
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~8 S2BV3@
eXA@J[-M:
4、释放连接 8*&|Q1`K:
cn.close(); )`5=6i
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &iI5^b-P
,hSTR)
可滚动、更新的记录集 SX1w5+p$C
1、创建可滚动、更新的Statement F<0GX!p4u
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); O_4j"0
该Statement取得的ResultSet就是可滚动的 N!lQ;o'
2、创建PreparedStatement时指定参数 Wj INY
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); s:zz8oN
ResultSet.absolute(9000); Q ym=L(X
批量更新 $*$X5
1、Statement Eg+z(m$M
Statement sm = cn.createStatement(); $97EeE:{M
sm.addBatch(sql1); q=x1:^rVH
sm.addBatch(sql2); |SX31T9rG
... R LNto5?
sm.executeBatch() Vw";< <0HZ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 p >h&SD?b
2、PreparedStatement pq +~|
PreparedStatement ps = cn.preparedStatement(sql); >(He,o@M
{ i87+9X
ps.setXXX(1,xxx); W&=F<n`
... ab8F\%y-8
ps.addBatch(); Lq#$q>!K
} )(V!& w6
ps.executeBatch(); \AY*x=PF
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 #-7w|
6 K-jje;)
事务的处理 8~|tl,
1、关闭Connection的自动提交 'U*Kb
cn.setAutoCommit(false); $s<bKju
2、执行一系列sql语句 AGMrBd|J{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close jM[]Uh
Statement sm ; uRnSwJ"hE
sm = cn.createStatement(insert into user...); ?#gYu%7DN
sm.executeUpdate(); 6b-E|;"]:^
sm.close(); "w&G1kw5I
sm = cn.createStatement("insert into corp...);
+`&-xq76
sm.executeUpdate(); ?4sF:Y+\
sm.close(); w,VUWja
3、提交 1kczlTF
cn.commit(); d>hLnz1O
4、如果发生异常,那么回滚 <G60R^o
cn.rollback();