java 数据库基本操作 r0 mXRZC
1、java数据库操作基本流程 &}N=a
2、几个常用的重要技巧: srX" vF
可滚动、更新的记录集 ~k}>CNTr
批量更新 #a :W
事务处理 )+!~xL
7-*QF>w<a
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 r@j$$Pk`
1、取得数据库连接 ]6#7TT
1)用DriverManager取数据库连接 RfM
uWo:
例子 e~Hx+Qp.G
String className,url,uid,pwd; SiBhf3
className = "oracle.jdbc.driver.OracleDriver"; JYQ.Y!X1O
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 6L`{oSX!
uid = "system"; C9?R*2L>
pwd = "manager"; o'9K8q\1
Class.forName(className); '%k<? *
Connection cn = DriverManager.getConnection(url,uid,pwd); X[F<sxw
2)用jndi(java的命名和目录服务)方式 jSY&P/[xb
例子 O^tH43C
String jndi = "jdbc/db"; v\LcZt`}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); xUp[)B6?:
DataSource ds = (DataSource) ctx.lookup(jndi); Km)5;BQxg
Connection cn = ds.getConnection(); fevLu[,
多用于jsp中 _3G;-iNX;
2、执行sql语句 /~k)#44
1)用Statement来执行sql语句 eh@6trzp=
String sql; u!iBAr5
Statement sm = cn.createStatement(); +Xa^3 =B
sm.executeQuery(sql); // 执行数据查询语句(select) (6Ssk4
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?2#!63[Kg
2)用PreparedStatement来执行sql语句 $-Ud&sjn
String sql; 7.-g=Rcz
sql = "insert into user (id,name) values (?,?)"; ]}K\&ho2
PreparedStatement ps = cn.prepareStatement(sql); q?Jd.r5*
ps.setInt(1,xxx); uU&,KEH
ps.setString(2,xxx); &3jq'@6
... v^Vr^!3
ResultSet rs = ps.executeQuery(); // 查询 .kv/db
int c = ps.executeUpdate(); // 更新 ;B8#Nf
7N@4c
3、处理执行结果 FW?zJ
查询语句,返回记录集ResultSet i&|fGX?-I
更新语句,返回数字,表示该更新影响的记录数 *6Ojv-
G|5
ResultSet的方法 yQ^k%hHa
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |7ga9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 XDtr{r6z
994
4、释放连接 w&A&BE^O/
cn.close(); me-:A:si
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 3ug|H
HwE1cOT
可滚动、更新的记录集 50 s)5G#
1、创建可滚动、更新的Statement w"-'
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ZcTxE]Y
该Statement取得的ResultSet就是可滚动的 M?61g(
2、创建PreparedStatement时指定参数 o6H\JCne
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =y5~7&9'
ResultSet.absolute(9000); mw^Di
批量更新 .zm'E<
1、Statement >DHpD?Pm!
Statement sm = cn.createStatement(); l7rGz2:?
sm.addBatch(sql1); (thDv rT@2
sm.addBatch(sql2); @iC,0AK4k
... jU 4*fzsZI
sm.executeBatch() oD5VE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Ihe/P {t]J
2、PreparedStatement c|f)k:Q
PreparedStatement ps = cn.preparedStatement(sql); 1|4'3^3
{ 8J&K_JC^
ps.setXXX(1,xxx); u )'l|Y
... }]-SAM
ps.addBatch(); Tk9/1C{8
} Ri,8rf0u
ps.executeBatch(); In-W,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 *`}4]OGv.
ELx?ph -9
事务的处理 Q77iMb]
1、关闭Connection的自动提交 ?V6+o`bm
cn.setAutoCommit(false); Sa V]6/|
2、执行一系列sql语句 (#w8/@JxF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close X%S9H^9
Statement sm ; *{5L*\AZ
sm = cn.createStatement(insert into user...); >E;&SX
sm.executeUpdate(); #8N9@
sm.close(); {J:ZM"GS
sm = cn.createStatement("insert into corp...); PB
!\r}Q
sm.executeUpdate(); x;RjLI 4h
sm.close(); G$ l>By
3、提交 7=.}484>J
cn.commit(); /MS*_
4、如果发生异常,那么回滚 {C=d9z~:
cn.rollback();