java 数据库基本操作 |3;(~a)%
1、java数据库操作基本流程 D{p5/#|r
2、几个常用的重要技巧: KCUU#t|8V\
可滚动、更新的记录集 rJQ=9qn\
批量更新 }c%
pH{HI
事务处理 E-fr}R}
q[ULGv
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 J &YQ]l
1、取得数据库连接 QU T"z'
1)用DriverManager取数据库连接 cy|%sf`
例子 CISO<z0
String className,url,uid,pwd; P~RhUKfd
className = "oracle.jdbc.driver.OracleDriver"; h^oH^moq<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #?Mj$ZB
uid = "system"; VFj(M
j`}G
pwd = "manager"; #`ls)-`7
Class.forName(className); 7,'kpyCj
Connection cn = DriverManager.getConnection(url,uid,pwd); -(#-I$z
2)用jndi(java的命名和目录服务)方式 ;`(R7X
*3
例子 rk|@B{CA;
String jndi = "jdbc/db"; xWE8Wm
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); dMvp&M\\'
DataSource ds = (DataSource) ctx.lookup(jndi); 3o6RbW0[
Connection cn = ds.getConnection(); pSfYu=#f
多用于jsp中 m"d/b~q
2、执行sql语句 2)
?q58
1)用Statement来执行sql语句 kl}Xmw{tJ
String sql; >jx.R
Statement sm = cn.createStatement(); A:# k
sm.executeQuery(sql); // 执行数据查询语句(select) P)6lu8zQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); riCV&0"n
2)用PreparedStatement来执行sql语句 TDNf)Mm
String sql; PJLR<9
sql = "insert into user (id,name) values (?,?)"; Gy"%R-j7
PreparedStatement ps = cn.prepareStatement(sql); @T:faJ5\'
ps.setInt(1,xxx); 9&Ne+MY^%
ps.setString(2,xxx); jQh^WmN
... `bG7"o`
ResultSet rs = ps.executeQuery(); // 查询 / T
c=
int c = ps.executeUpdate(); // 更新 sZhMa>
OCV+h'
3、处理执行结果 4Ysb5m)u
查询语句,返回记录集ResultSet %.HJK
更新语句,返回数字,表示该更新影响的记录数 o[\HOe~;
ResultSet的方法 _.V?A*
1、next(),将游标往后移动一行,如果成功返回true;否则返回false bzZ>lyH
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 G"dS+,Q
r[txlQI9
4、释放连接 T*[
VY1
cn.close(); Ao9R:|9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ?]O7Ao
oG oK,
可滚动、更新的记录集 '0RwO[A#1
1、创建可滚动、更新的Statement ~P*4V]L^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 2 QTZwx
该Statement取得的ResultSet就是可滚动的 ^jE8+h
2、创建PreparedStatement时指定参数 `~BZ1)@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); p0:kz l4$
ResultSet.absolute(9000); ~B i_7 Q
批量更新 ]< l6s
1、Statement 5z}w}zdg
Statement sm = cn.createStatement(); ?~e3&ux
sm.addBatch(sql1); J3RB]O_
sm.addBatch(sql2); _qwQ;!9
... fxcc<h4
sm.executeBatch() `fNpY#QsN
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 13k
!'P
2、PreparedStatement (2ot5x}`j
PreparedStatement ps = cn.preparedStatement(sql); =8Jfgq9E
{ M~e0lg8
ps.setXXX(1,xxx); -Apc$0ZsN
... }L=/A7Nk>
ps.addBatch(); N"tFP9;K
} sic"pn],U
ps.executeBatch(); OR1DYHHT/1
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Ws U)Y&
4R^mI
事务的处理 1/+C5Bp*
1、关闭Connection的自动提交 LkruL_E>
cn.setAutoCommit(false); ,_.I\EY[
2、执行一系列sql语句 }Db[ 4
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 3g'S\G@
Statement sm ; s8"8y`u
sm = cn.createStatement(insert into user...); {P%9
sm.executeUpdate(); |077Sf|
sm.close(); 6 gL=u-2
sm = cn.createStatement("insert into corp...); {PP9$>4`l
sm.executeUpdate(); f
3V Dv9(
sm.close(); ^|~mlY@w
3、提交 Y_&g="`Q
cn.commit(); F_iXd/
4、如果发生异常,那么回滚 M-L2w"
cn.rollback();