java 数据库基本操作 o<nS_x
1、java数据库操作基本流程 j$mz3Yk
2、几个常用的重要技巧: jI A#!4
可滚动、更新的记录集 AJdp6@O+
批量更新 a(f(R&-:$Y
事务处理
'mJ13
R B%:h-t4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @%:E }
1、取得数据库连接 h"r!q[MNo
1)用DriverManager取数据库连接 @<a|
例子 M|H2kvl
String className,url,uid,pwd; pr/'J!{^
className = "oracle.jdbc.driver.OracleDriver"; 9>;} /*:H
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ZL,8,;]
uid = "system"; [1U{ci&=p
pwd = "manager"; "O``7HA}
Class.forName(className); v1h.pbz`w
Connection cn = DriverManager.getConnection(url,uid,pwd); DL1
+c`d
2)用jndi(java的命名和目录服务)方式
l|7O)
例子 ;P8(Zf3wJb
String jndi = "jdbc/db"; ~2(]ZfO?>H
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ;t!9]1
DataSource ds = (DataSource) ctx.lookup(jndi); >8(jW
Connection cn = ds.getConnection(); 'B,KFA<
多用于jsp中 {"t5\U6cKM
2、执行sql语句 \FXp*FbQ
1)用Statement来执行sql语句 ~?d>fR:X
String sql; ;Yv14{T!
Statement sm = cn.createStatement(); hJLT!33:
sm.executeQuery(sql); // 执行数据查询语句(select) 7gr^z)${J
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); GL`tOD:P"
2)用PreparedStatement来执行sql语句
0#^Bf[Dn
String sql; ,Y-S(
sql = "insert into user (id,name) values (?,?)"; [4: Yi{>
PreparedStatement ps = cn.prepareStatement(sql); q~M2:SN@X
ps.setInt(1,xxx); OT@yPG
ps.setString(2,xxx); _@K YF)
... 7f*
RM
ResultSet rs = ps.executeQuery(); // 查询 r>O|L%xpv
int c = ps.executeUpdate(); // 更新 \OY}GRKt
/?U!y?t&@
3、处理执行结果 b` zET^F
查询语句,返回记录集ResultSet {mf.!Xev
更新语句,返回数字,表示该更新影响的记录数 }^ ,q#'
ResultSet的方法 =JxFp,
Xr
1、next(),将游标往后移动一行,如果成功返回true;否则返回false gH'3 dS!{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Sc{Tq\t;%
(0}j]p'w
4、释放连接 #D0 ~{H
cn.close(); `O
n(v
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection x0ne8NDP
Why"G1`
可滚动、更新的记录集 f"P$f8$
1、创建可滚动、更新的Statement _A3X6
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); @ZG>mP1Vo
该Statement取得的ResultSet就是可滚动的 6KO(j/Gwp
2、创建PreparedStatement时指定参数
mV;3ILO
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); abSq2*5K
ResultSet.absolute(9000); [T]Bf o
批量更新 5*+I
M*c
1、Statement gyFr"9';c
Statement sm = cn.createStatement(); \Z'/+}^h
sm.addBatch(sql1); shzG
Eb
sm.addBatch(sql2); uJ8x
... #j.FJFGX
sm.executeBatch() R[Nbtbv9Q
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ^RDU
p5,T
2、PreparedStatement P5P<"
PreparedStatement ps = cn.preparedStatement(sql); tR;{.
{ q5?{1
ps.setXXX(1,xxx); ckWkZ
78\
... cmIT$?J
ps.addBatch(); .)t(:)*b
} 6klD22b2$
ps.executeBatch(); cd&B?\I
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 u#3)p
L#!$hq9{_
事务的处理 UFf,+4q
1、关闭Connection的自动提交 63C(Tp"
cn.setAutoCommit(false); oLw|uU-|
2、执行一系列sql语句 8W$L:{ez
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
J `x}{K
Statement sm ; yKlU6t&`
G
sm = cn.createStatement(insert into user...); fp tIc#4
sm.executeUpdate(); ;h9W\Se
sm.close(); gi1j/j7
sm = cn.createStatement("insert into corp...); .:[`j3s )Y
sm.executeUpdate(); o?y"]RCM
sm.close(); `V@z&n0P6
3、提交
:$2Yg[Zc3
cn.commit(); zb?kpd}r
4、如果发生异常,那么回滚 :P,2K5]y
cn.rollback();