java 数据库基本操作 hC<14
1、java数据库操作基本流程 P]6}\
]~
2、几个常用的重要技巧: ')TPF{\#
可滚动、更新的记录集 GESXc$E8
批量更新 *HlDS22
事务处理 =uV,bG5V1
hnxc`VX>g
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ARB7>"
1、取得数据库连接 v 81rfB5
1)用DriverManager取数据库连接 'gTmH [be
例子 NPJ.+ph
String className,url,uid,pwd; (6qsKX
className = "oracle.jdbc.driver.OracleDriver"; f&I7,"v
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @.$MzPQQI
uid = "system"; );JJ2Jlkd
pwd = "manager"; -
q@69q
Class.forName(className); 8;zDg$(
Connection cn = DriverManager.getConnection(url,uid,pwd); SG'JE}jzO
2)用jndi(java的命名和目录服务)方式 a G27%(@
例子 ]0~qi@
String jndi = "jdbc/db"; v\A.Tyy
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); R@`rT*lJ
DataSource ds = (DataSource) ctx.lookup(jndi); =_-C%<4
Connection cn = ds.getConnection(); :pZ}*?\
多用于jsp中 `gguip-C
2、执行sql语句 Spj9H ?m
1)用Statement来执行sql语句 kQIw/@WC
String sql; IN !02`H
Statement sm = cn.createStatement(); =*MR(b>
sm.executeQuery(sql); // 执行数据查询语句(select) vrIV%l=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Rlw3!]5+2
2)用PreparedStatement来执行sql语句 Z^_>A)<s<
String sql; Ft-6m%
sql = "insert into user (id,name) values (?,?)"; x)viY5vjH
PreparedStatement ps = cn.prepareStatement(sql); km 5E)_]
ps.setInt(1,xxx); Ci\? ^
ps.setString(2,xxx); ~j&?/{7I
... +{-]P\oc
ResultSet rs = ps.executeQuery(); // 查询 F)ci9- b@
int c = ps.executeUpdate(); // 更新 VifmZ;S@Y
<DmTj$
3、处理执行结果 ^.HWkS`e
查询语句,返回记录集ResultSet c> ~:dcy
更新语句,返回数字,表示该更新影响的记录数 n0fR u`SNV
ResultSet的方法 JAP(|
1、next(),将游标往后移动一行,如果成功返回true;否则返回false jD9lz-Y@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 uxDLDA$;
;Bs^iL
4、释放连接 "tR}j,=S:D
cn.close(); X;EJ&g/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |]ucHV
)f*Iomp]@
可滚动、更新的记录集 h~UJCnzS
1、创建可滚动、更新的Statement u0]q`u/T
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); =cp;Q,t'9L
该Statement取得的ResultSet就是可滚动的 #7W.s!#}Dd
2、创建PreparedStatement时指定参数 2d&^Sp&11
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); }$aNOf%:
ResultSet.absolute(9000); ;`j U_
批量更新 vm}G[
1、Statement e'~ Q@_D
Statement sm = cn.createStatement(); pxplWP,
sm.addBatch(sql1); HdCk!Fv
sm.addBatch(sql2); s[V`e2O
... l,y^HTc}7/
sm.executeBatch() <\DUo0]J
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 GOr}/y;
2、PreparedStatement VGJDqm!
PreparedStatement ps = cn.preparedStatement(sql); _rjBc;a
{ ,nYZxYLf+
ps.setXXX(1,xxx); cU | _
... !5.v'K'
ps.addBatch(); 5
,ZRP'oI
} g:i*O^c@
ps.executeBatch(); t)(v4^T
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3o0IjZ=[>
1t2cY;vJ
事务的处理 :,YLx9i>
1、关闭Connection的自动提交 %ck`0JZAP
cn.setAutoCommit(false); wAz,vq=x
2、执行一系列sql语句 78w4IICk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @:gl:mc
Statement sm ; ^[TOZXL`:
sm = cn.createStatement(insert into user...); *k6$
sm.executeUpdate(); (Y;'[.
sm.close(); =|JKu'
sm = cn.createStatement("insert into corp...); gA+YtU{z
sm.executeUpdate(); J/7u7_
sm.close(); M?hFCt3Y
3、提交 <2)v9c
cn.commit(); NDo^B7R-
4、如果发生异常,那么回滚 -W^2*w
cn.rollback();