java 数据库基本操作 XRM/d5
1、java数据库操作基本流程 x| D|d}
2、几个常用的重要技巧:
|,KsJ2hD
可滚动、更新的记录集 ('%Y3z;
批量更新 8d1qRCIz
事务处理 %qJgtu"8
|j/Y#.k;{0
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 $EIKi'!8
1、取得数据库连接 nT4Ryld
1)用DriverManager取数据库连接 S_*Gv O
例子 rpEIDhHv
String className,url,uid,pwd; 2T%sHp~qt
className = "oracle.jdbc.driver.OracleDriver"; [ZG>FJDl8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3bd`q
$
uid = "system"; RwK6u-u#9
pwd = "manager"; b&,ZmDJh
Class.forName(className); a{^2c!
Connection cn = DriverManager.getConnection(url,uid,pwd); O)R}|
2)用jndi(java的命名和目录服务)方式 Y]~-S
例子
;j~%11
String jndi = "jdbc/db"; +p _?ekV\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); lZkJ<*z#
DataSource ds = (DataSource) ctx.lookup(jndi); ?t}s3P!Q3w
Connection cn = ds.getConnection(); ])v61B
多用于jsp中 IrRe6nf@K
2、执行sql语句 :Eh}]_
1)用Statement来执行sql语句 ;9#W#/B
String sql; +F,])p4,]i
Statement sm = cn.createStatement(); g>7i2
sm.executeQuery(sql); // 执行数据查询语句(select) TXd6o=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); EAr;
2)用PreparedStatement来执行sql语句 9A{D<h}yk
String sql; F&CvqPI
sql = "insert into user (id,name) values (?,?)"; K)1Lg?j
PreparedStatement ps = cn.prepareStatement(sql); Q|VBH5}1O
ps.setInt(1,xxx); X16O9qsh
ps.setString(2,xxx); }"RVUYU
... c|'$3dB*
ResultSet rs = ps.executeQuery(); // 查询 37IHn6r\
int c = ps.executeUpdate(); // 更新 t0xE
2u0B=0x
3、处理执行结果 [SKDsJRPP
查询语句,返回记录集ResultSet y%
!.:7Y
更新语句,返回数字,表示该更新影响的记录数 7F2:'3SQ
ResultSet的方法 lpB:lRM
1、next(),将游标往后移动一行,如果成功返回true;否则返回false A#Ga!a
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 C\Ob!sv%H
@az<D7j2
4、释放连接 d@8:f
cn.close(); !z:j-gT3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection MkdC*|
B1I{@\z0G
可滚动、更新的记录集 PxWH)4
1、创建可滚动、更新的Statement Mc8_D,7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ~ e<,GUx(]
该Statement取得的ResultSet就是可滚动的 >#;_Ebl@
2、创建PreparedStatement时指定参数 8"LM:0x
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?#doH,
ResultSet.absolute(9000); J?E!\V&U
批量更新 fS8Pi,!
1、Statement 2h}FotlO
Statement sm = cn.createStatement(); q)@;8Z=_c
sm.addBatch(sql1); lA6{TH.x
sm.addBatch(sql2); pp#!sRUKPV
... 1n*"C!q
sm.executeBatch() G7GKO
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0>;[EFL
2、PreparedStatement 3qV~C{S
PreparedStatement ps = cn.preparedStatement(sql); o5+7Lt]
{ BHkicb ?
ps.setXXX(1,xxx); VY|UB7,C
... A??a:8id^
ps.addBatch(); y+7+({w<
} VsL*&Fk
ps.executeBatch(); /7a3*a
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。
31]Vo;D
>h9~
/
事务的处理 2]x,joB
1、关闭Connection的自动提交 bx7hQzoX=b
cn.setAutoCommit(false); Fy>g*3
2、执行一系列sql语句 Y_XRf8Sw
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close tqt~F2u
Statement sm ; >*|Eyv_
sm = cn.createStatement(insert into user...); ne[H `7c
sm.executeUpdate(); ^|!\IzDp
sm.close(); ZXbq5p_
sm = cn.createStatement("insert into corp...); hO$29_^"
sm.executeUpdate(); UpiZd/K
sm.close(); R&'Mze fb
3、提交 0N6 X;M{zh
cn.commit(); l{kacfk#
4、如果发生异常,那么回滚 a94nB
cn.rollback();