java 数据库基本操作 /\.kH62
1、java数据库操作基本流程 W~qo
`r
2、几个常用的重要技巧: =W6P>r_
可滚动、更新的记录集 :zCm$@
批量更新 fHiCuF
事务处理 mTt 9 o9E
T
&1sfS,
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 E_z@\z MB
1、取得数据库连接 j8b:+io
1)用DriverManager取数据库连接 Cn,dr4J[
例子 t
t=$:}A
String className,url,uid,pwd; t%%I.zIV7
className = "oracle.jdbc.driver.OracleDriver"; (0S"ZT
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; lZ|Ao0(
uid = "system"; &xVWN>bd^
pwd = "manager"; !dGgLU_
Class.forName(className); 9D
bp`%j
Connection cn = DriverManager.getConnection(url,uid,pwd); 6\`,blkX
2)用jndi(java的命名和目录服务)方式 6\bbP>ql
例子 s}.nh>Q
String jndi = "jdbc/db"; AxeWj%w@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); >/>a++19
DataSource ds = (DataSource) ctx.lookup(jndi); p81~Lk*Hz@
Connection cn = ds.getConnection(); JBqzQ^[n
多用于jsp中 j EX([J1
2、执行sql语句 ]Vubz54
1)用Statement来执行sql语句 _^B+Xo@E-
String sql;
&HE8O}<>
Statement sm = cn.createStatement(); REJ}T:
sm.executeQuery(sql); // 执行数据查询语句(select) .F]6uXd
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); HZm44y$/
2)用PreparedStatement来执行sql语句 [x&&N*>N
String sql; 1Dbe0u
sql = "insert into user (id,name) values (?,?)"; #
;9KDt@
PreparedStatement ps = cn.prepareStatement(sql); `yhL11]~
ps.setInt(1,xxx); .C1^QY-wL
ps.setString(2,xxx); }E=mZZ)
... lIf Our
ResultSet rs = ps.executeQuery(); // 查询 U>>J_2
int c = ps.executeUpdate(); // 更新 o)$sZ{` ="
67e1Y@Xu
3、处理执行结果 ]Kf HuYjM
查询语句,返回记录集ResultSet 6 3HxQH
更新语句,返回数字,表示该更新影响的记录数 0YS*=J"7z
ResultSet的方法 `s+qz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false i55']7+0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 SSzOz-&GA
6@d( <Z
4、释放连接 9SrV,~zD
cn.close(); H=dj\Br`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection /f#sg7)
T57S!CJ^$5
可滚动、更新的记录集 }b-?Dm_H
1、创建可滚动、更新的Statement :{sX8U%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Mfgd;FsX#
该Statement取得的ResultSet就是可滚动的 d&fENnt?h
2、创建PreparedStatement时指定参数 B!5gD
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); r4-r
z+x
ResultSet.absolute(9000); @a~K#Bvlm
批量更新 h_cZ&P|
1、Statement -Ju!2by
Statement sm = cn.createStatement(); xGA%/dy,;
sm.addBatch(sql1); 1.uyu
sm.addBatch(sql2); +n0y/0Au
... SZgH0W("L
sm.executeBatch() |h3YL!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 {30A1>0#P
2、PreparedStatement ^Ab|\5^3
PreparedStatement ps = cn.preparedStatement(sql); Oz+>I^Q
{ ]!f=b\-Av
ps.setXXX(1,xxx); cgU7)`0j
... Gf"/fpeQx
ps.addBatch(); \dP2xou=
} rsP1?Hxq
ps.executeBatch(); zRz3ot,|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ICGBU>Db
FNUue
事务的处理 |ey6Czm
1、关闭Connection的自动提交 T# 8O:
cn.setAutoCommit(false); &BQ`4j~.
2、执行一系列sql语句 iQA
f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close F`3I~(
Statement sm ; rUj]6j=e
sm = cn.createStatement(insert into user...); y:457R2F
sm.executeUpdate(); L:S[QwQu8
sm.close(); <5nz:B/
sm = cn.createStatement("insert into corp...); b[/-lNrc
sm.executeUpdate(); 'a0$74f z
sm.close(); @ )1u
3、提交 <)rol
cn.commit(); Oh|Hy/&6W
4、如果发生异常,那么回滚 j/9'L^]
cn.rollback();