java 数据库基本操作 Hf'yRKACj
1、java数据库操作基本流程 zjrr*iw
2、几个常用的重要技巧: p3NTI /-
可滚动、更新的记录集 -)Y?1w
批量更新 %Jpb&CEY
事务处理 /B?hM&@z
6/#5TdJA
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 mJ%r2$/*
1、取得数据库连接 Y%V|M0 0`
1)用DriverManager取数据库连接 d">Ya !W
例子 9$xEktfV
String className,url,uid,pwd; plY`lqm
className = "oracle.jdbc.driver.OracleDriver"; > HL8hN'q'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =/Dp*
uid = "system"; !I? J^0T
pwd = "manager"; PUN.nt
Class.forName(className); N3};M~\
Connection cn = DriverManager.getConnection(url,uid,pwd); RhJL`>W`
2)用jndi(java的命名和目录服务)方式 2,>q(M6,EA
例子 2Z-BZu K6p
String jndi = "jdbc/db"; 3o'SY@'W
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); rGZ@pO2
DataSource ds = (DataSource) ctx.lookup(jndi); IP1|$b}sq
Connection cn = ds.getConnection(); Wb4%=2Qn
多用于jsp中 \4SFD3$&
2、执行sql语句 uK?T<3]'
1)用Statement来执行sql语句 $Q:5KNF+p
String sql; 7<=7RPWmD
Statement sm = cn.createStatement(); i#jCf3%+
h
sm.executeQuery(sql); // 执行数据查询语句(select) "*@iXJxv5
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?nFT51t/4
2)用PreparedStatement来执行sql语句 NRKAEf_#w
String sql; ;D/'7f7.}
sql = "insert into user (id,name) values (?,?)"; azB~>#H~
PreparedStatement ps = cn.prepareStatement(sql); n^/,>7J
ps.setInt(1,xxx); ]T+.kC
M
ps.setString(2,xxx); >NE]TZ.F
...
YV 9*B
ResultSet rs = ps.executeQuery(); // 查询 qR_"aQ7s2
int c = ps.executeUpdate(); // 更新 %;9eh'
ZUyM:$
3、处理执行结果 zYOPE 6E
查询语句,返回记录集ResultSet |k'I?:'
更新语句,返回数字,表示该更新影响的记录数 jkNZv. )p
ResultSet的方法 WII_s|YSt%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 0 EXAdRR
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 kmW!0hm;e
lb1(1|#
4、释放连接 \Mlj
7.u]
cn.close(); U
gB
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection e7L;{+XI
yh5KN_W
可滚动、更新的记录集 su=.4JcK
1、创建可滚动、更新的Statement 9GZF39w u
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); d1j v>tu
该Statement取得的ResultSet就是可滚动的 /]xd[^
2、创建PreparedStatement时指定参数 j.CC.[$g
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); YA^9, q6u?
ResultSet.absolute(9000); Pr<?E[
批量更新 :B- ,*@EU
1、Statement {uj9fE,)
Statement sm = cn.createStatement(); g{$&j*Q9
sm.addBatch(sql1); (oJ#`k:&n
sm.addBatch(sql2); PJAir8
... rI]:| k
sm.executeBatch() q#\eL~k
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 WaMn[/{
2、PreparedStatement d(a6vEL4
PreparedStatement ps = cn.preparedStatement(sql); Iz{AA-
{ ((dG<
ps.setXXX(1,xxx); .^kTb2$X
... z|P& 8#txM
ps.addBatch(); wU#Q>ut'%
} 9I RE@c
ps.executeBatch(); <{-DYRiN
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6!Isz1.re
N7#GK]n%/}
事务的处理 gdC=SFb b
1、关闭Connection的自动提交 "Pys3=h
cn.setAutoCommit(false); "Ln\ZYB]
2、执行一系列sql语句 C1G Wi4)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &2\.6rb.
Statement sm ; y6jTT%
sm = cn.createStatement(insert into user...); %n}]$
d
sm.executeUpdate(); M(3E
b;`
sm.close(); 6
*8G e
sm = cn.createStatement("insert into corp...); gieX`}
sm.executeUpdate(); U |4%ydG
sm.close(); *gT
TI;:
3、提交 hcaH
cn.commit(); %)aDh
}
4、如果发生异常,那么回滚 Hh@mIusj
cn.rollback();