java 数据库基本操作 R7B,Q(q2-
1、java数据库操作基本流程 txml*/zL
2、几个常用的重要技巧: W`Q$t56
可滚动、更新的记录集 n-hvh-ZO
批量更新 ||=[kjG~
事务处理 W%>i$:Qq
=CKuiO.j
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Y%fVt|
1、取得数据库连接 'wz\tT ^
1)用DriverManager取数据库连接 vcw>v={x
例子 YXX36
String className,url,uid,pwd; %kK
][2e
className = "oracle.jdbc.driver.OracleDriver"; ws>WA{]gq
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ]{,Gf2v;;d
uid = "system"; 1tc]rC4h
pwd = "manager"; {K45~ha9!m
Class.forName(className); qY$*#*Q
Connection cn = DriverManager.getConnection(url,uid,pwd); ~_u*\]-
2)用jndi(java的命名和目录服务)方式 g|K6iY
例子 =f4[=C$&`
String jndi = "jdbc/db"; fO^e+Mz
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &c!j`86y*
DataSource ds = (DataSource) ctx.lookup(jndi); <\" .L
Connection cn = ds.getConnection(); cq*=|m0}Z
多用于jsp中 sc W'AJJq
2、执行sql语句 h>alGLN>
1)用Statement来执行sql语句 BYi)j6"
String sql; V
>Hf9sZ
Statement sm = cn.createStatement(); q@n^ZzTx
sm.executeQuery(sql); // 执行数据查询语句(select) 6 "U8V?E
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); SHD^}?-|
2)用PreparedStatement来执行sql语句 3NIUW!gr
String sql; +E/y ~s
sql = "insert into user (id,name) values (?,?)"; ;
dd Q/
PreparedStatement ps = cn.prepareStatement(sql); Gs
dnf 7
ps.setInt(1,xxx); s@hRqGd:
ps.setString(2,xxx); 2F#q
I1
... Sn4[3JV $l
ResultSet rs = ps.executeQuery(); // 查询 P|tNL}2`;
int c = ps.executeUpdate(); // 更新 C:8_m1Y{
3@Z#.FV~C[
3、处理执行结果 >gwz,{
查询语句,返回记录集ResultSet jOpcV|2
更新语句,返回数字,表示该更新影响的记录数 7pA/
ResultSet的方法 38DT2<qC
1、next(),将游标往后移动一行,如果成功返回true;否则返回false fb~=Y$|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 #rO8K f
:0)3K7Q
4、释放连接 5]I| DHmu
cn.close(); -<v~snq'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ch$*Gm19Z
7@lS.w\#-
可滚动、更新的记录集 ;w|b0V6
1、创建可滚动、更新的Statement 6
5y+Z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); V7G7&'
该Statement取得的ResultSet就是可滚动的 I):!`R.,
2、创建PreparedStatement时指定参数 "8^5>EJWv
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); MNSbtT*^
ResultSet.absolute(9000); >Wz;ySEz
批量更新 !qX_I db\
1、Statement r2k2%nI-J
Statement sm = cn.createStatement(); A^p[52`
sm.addBatch(sql1); ei
rzYt
sm.addBatch(sql2); dDF
.qXq.
... gks{\ H]
sm.executeBatch() ?(R]9.5S
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H<^/Ati,|
2、PreparedStatement f%V4pzOc"
PreparedStatement ps = cn.preparedStatement(sql); :UQTEdc{
{ y.[Mnj
ps.setXXX(1,xxx); ;pnD0bH
... ,Jd
',>3
ps.addBatch(); PG,_^QGCX
} R+Y4|
ps.executeBatch(); s+Q~~]HJM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 XP@1~$
L*~J%7
事务的处理 /<]{KI
1、关闭Connection的自动提交 J52
o
g4l
cn.setAutoCommit(false); kJ Mf
2、执行一系列sql语句 Iwc{R8BV
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close `4~H/'%QB
Statement sm ; >b]S3[Q(
sm = cn.createStatement(insert into user...); afb+GA!
sm.executeUpdate(); J;f!!<l\
sm.close(); uECsh2Uin
sm = cn.createStatement("insert into corp...); b%S62(qP
sm.executeUpdate(); H
`(exa:w
sm.close(); XGkkB
3、提交 uI DuGrt
cn.commit(); h)me\U7UC
4、如果发生异常,那么回滚 wm+})SOX9
cn.rollback();