java 数据库基本操作 {-c[w&q
1、java数据库操作基本流程 .9bP8u2B{
2、几个常用的重要技巧: 'UCF2L
可滚动、更新的记录集 bU(fH^
批量更新 FCr> $
事务处理 z 2V_nkI
Y6%O 9b
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9%uJ:c?
1、取得数据库连接 2ap0/l[
1)用DriverManager取数据库连接 Jo ]8?U(^
例子 \.dvRI'
String className,url,uid,pwd; A0Hs d
className = "oracle.jdbc.driver.OracleDriver"; ZA4vQDW
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; q>ps99[=
uid = "system"; 0l ]K%5#
pwd = "manager"; DbkKmv&
Class.forName(className); +lqX;*a=N
Connection cn = DriverManager.getConnection(url,uid,pwd); ] Vbv64M3
2)用jndi(java的命名和目录服务)方式 RoWGQney
例子 7fJWb)z!k
String jndi = "jdbc/db"; Lm }:`
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); FCEFg)c5=
DataSource ds = (DataSource) ctx.lookup(jndi); cA4xx^~
Connection cn = ds.getConnection(); wg=ge]E5
多用于jsp中 7.l[tKh
2、执行sql语句 l;SqjkN
1)用Statement来执行sql语句 9IC|2w66
String sql; q G%'Lt
Statement sm = cn.createStatement(); Ie~#k[X
sm.executeQuery(sql); // 执行数据查询语句(select) dw!cDfT+
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Iw$7f kq
2)用PreparedStatement来执行sql语句 ,$96bF "#
String sql;
um[nz
sql = "insert into user (id,name) values (?,?)"; F\Gi;6a
PreparedStatement ps = cn.prepareStatement(sql); Vn6 g(:\w
ps.setInt(1,xxx); /t083
ps.setString(2,xxx); xCMcS~
3/
... vo[Zuv?<h
ResultSet rs = ps.executeQuery(); // 查询 IgOo2N"^l
int c = ps.executeUpdate(); // 更新 Y\len
COa"zg
3、处理执行结果 w"O^CR)
查询语句,返回记录集ResultSet c6;tbL
更新语句,返回数字,表示该更新影响的记录数 .j}dk.#h
ResultSet的方法 wYJ. F
1、next(),将游标往后移动一行,如果成功返回true;否则返回false UHYnl]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 hSq3LoHV
|*Dklo9{
4、释放连接 DKu4e
cn.close(); jd|? aK;(
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection AAE8j.
H\7Qf8s|{
可滚动、更新的记录集 lz1l1.f8
1、创建可滚动、更新的Statement 1;R1Fj&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); X/fk&Cp
该Statement取得的ResultSet就是可滚动的 h+Dp<b
2、创建PreparedStatement时指定参数 R g7 O
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +^
n\?!
ResultSet.absolute(9000); ~*9
vn Z@
批量更新 C#`VVtei
1、Statement q"@Y2lhD!
Statement sm = cn.createStatement(); '-tiH
sm.addBatch(sql1); X|)Ox
,(
sm.addBatch(sql2); pt&(c[
... ixZ w;+h
sm.executeBatch() 1CFTQB >
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 w:P$S
2、PreparedStatement JW ;DA E<
PreparedStatement ps = cn.preparedStatement(sql); !SAjV)
{ x'OE},>i
ps.setXXX(1,xxx); BD+V{x}P
... pJ7M.C!
ps.addBatch(); *P,dR]-m
} ?'_E$
ps.executeBatch(); C~F do0D
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 o;+$AU1f
oqa]iBO
事务的处理 2yk32|
1、关闭Connection的自动提交 %y{#fZHc
cn.setAutoCommit(false); -z9-f\
2、执行一系列sql语句 c`94a SnV
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 7yGc@kJ?
Statement sm ; qi7(RL_N
sm = cn.createStatement(insert into user...); OTs vox|(
sm.executeUpdate(); Zi5d"V[}T
sm.close(); C
7)w8y
sm = cn.createStatement("insert into corp...); M8oCh
sm.executeUpdate(); QZ!;` ?(
sm.close(); ],l
w
3、提交 #?/&H;n_8S
cn.commit(); RO(~c-fV
4、如果发生异常,那么回滚 {//;GC*
cn.rollback();