java 数据库基本操作 :'*DMW~
1、java数据库操作基本流程 >;nS8{2o
2、几个常用的重要技巧: Coa -8j*R7
可滚动、更新的记录集 @J vZ[T/
批量更新 >V!LitdJ
事务处理 sR*Nq5F#9
D;js.ZF
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Y\?j0X;
1、取得数据库连接 arh@`'Q
1)用DriverManager取数据库连接 |F!F{d^p
例子 E
_iO@
String className,url,uid,pwd; mU G
%LM
className = "oracle.jdbc.driver.OracleDriver"; 8QF`,oXQO
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7GZq|M_:y
uid = "system"; Z2p> n`D
pwd = "manager"; +t]Xj1Q
Class.forName(className); 3s(Ia^
Connection cn = DriverManager.getConnection(url,uid,pwd); ("Dv>&w9
2)用jndi(java的命名和目录服务)方式 ZBc|438[
例子 z[&s5"
String jndi = "jdbc/db"; ]k+m=OR{/
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _;e\:7<m
DataSource ds = (DataSource) ctx.lookup(jndi); D,rZ0?R
Connection cn = ds.getConnection(); Z+idLbIs
多用于jsp中 ,{{SI
2、执行sql语句 (@&I_>2Q
1)用Statement来执行sql语句 $']VQ4tZ
String sql; 40K2uT{cq
Statement sm = cn.createStatement(); =n0*{~r
sm.executeQuery(sql); // 执行数据查询语句(select) -(;LQDG |
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); /EFq#+6
2)用PreparedStatement来执行sql语句 c8DZJSO
String sql; `ROEV~
sql = "insert into user (id,name) values (?,?)"; Dip*}8$o(w
PreparedStatement ps = cn.prepareStatement(sql); WC-_+9)2&
ps.setInt(1,xxx); n33kb/q*
ps.setString(2,xxx); U9ZbVjqv@
... H_B~P%E@]
ResultSet rs = ps.executeQuery(); // 查询 =!<G!^
int c = ps.executeUpdate(); // 更新 mG(N:n%*K
kRot7-7I|
3、处理执行结果 +d39f-[
查询语句,返回记录集ResultSet E
$6ejGw-
更新语句,返回数字,表示该更新影响的记录数 0Nr\2|
ResultSet的方法 kuS/S\Z5K
1、next(),将游标往后移动一行,如果成功返回true;否则返回false GGE[{Gb9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 _ #'9kx|)
oR %agvc^^
4、释放连接 >q(6,Mmb
cn.close(); xm^95}80yh
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection :ba/W&-d
eXzXd*$S
可滚动、更新的记录集 '_o@VO
1、创建可滚动、更新的Statement @"8R3BN
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;<-7*}Dj
该Statement取得的ResultSet就是可滚动的 rn" pKUd
2、创建PreparedStatement时指定参数 \P?A7vuhLs
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); K]"Kf{bx
ResultSet.absolute(9000); Tf-CEHWD
批量更新 uec|S\~M
1、Statement -p8e
Statement sm = cn.createStatement(); ~A >oO-0K
sm.addBatch(sql1); )H+kB<n
sm.addBatch(sql2); PDC]wZd/
... -g~~] K%
sm.executeBatch() XO
wiHW{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 pFIecca w
2、PreparedStatement 1xTTJyoq
PreparedStatement ps = cn.preparedStatement(sql); `clB43i
{ .~`Y)PON
ps.setXXX(1,xxx); pP\h6b+B
... knSuzq%*
ps.addBatch(); =kFuJ
x)f
} }O*WV 1
ps.executeBatch(); V/bH^@,sA
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~`Sle
xK|}
)w"0w(
事务的处理 y Nva1I
1、关闭Connection的自动提交 4<}A]BQVkJ
cn.setAutoCommit(false); ']?=[`#NL
2、执行一系列sql语句 kaFnw(xa
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 8"M<{72U]
Statement sm ; C EqZ:c
sm = cn.createStatement(insert into user...); r~oSP^e'
sm.executeUpdate(); ct0v$ct>f
sm.close(); f z%tA39m
sm = cn.createStatement("insert into corp...); KXe
ka
sm.executeUpdate(); ( V4G<-jG
sm.close(); O5-;I,)H
3、提交 x!?Z*v@I
cn.commit(); 'F5)ACA%
4、如果发生异常,那么回滚 :]c=pH
cn.rollback();