java 数据库基本操作 njMy&$6a##
1、java数据库操作基本流程 .}N^AO=
2、几个常用的重要技巧: =fG8YZ(
可滚动、更新的记录集 @W8}N|jek
批量更新 JZzf,G:
事务处理 '.yWL
6sl<Z=E#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 VWy:U#;+8
1、取得数据库连接 lg>AWTW[
1)用DriverManager取数据库连接 j*4S] !
例子 `uA&w}(G
String className,url,uid,pwd; Nh9!lB m*]
className = "oracle.jdbc.driver.OracleDriver"; ]ECZU
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; )c/y07er
uid = "system"; )`mF.87b&h
pwd = "manager"; dY<#a,eS
Class.forName(className); ; ZV^e
Connection cn = DriverManager.getConnection(url,uid,pwd); 5R `6zhf
2)用jndi(java的命名和目录服务)方式 v:MS0]
例子 2TEeP7
String jndi = "jdbc/db"; K)&XQ`&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8$U ZL
DataSource ds = (DataSource) ctx.lookup(jndi); Q+(:n)G_6E
Connection cn = ds.getConnection(); 2bnIT>(
多用于jsp中 9Fx z!-9m
2、执行sql语句 hX%v`8
1)用Statement来执行sql语句 T zYgH
String sql; NB5B$q_'#
Statement sm = cn.createStatement(); -_DiD^UcXn
sm.executeQuery(sql); // 执行数据查询语句(select) o%PoSZZ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z4ov
2)用PreparedStatement来执行sql语句 So%1RY{)
String sql; ',`4 U F
sql = "insert into user (id,name) values (?,?)"; NoZ4['NI\
PreparedStatement ps = cn.prepareStatement(sql); :TYzzl43
ps.setInt(1,xxx); h)
PB
ps.setString(2,xxx); 1r&
?J.z25
... C$G88hesn
ResultSet rs = ps.executeQuery(); // 查询 Q
EGanpz
int c = ps.executeUpdate(); // 更新 YCBML!L
rqe_zyc&
3、处理执行结果 RK:sQWG
查询语句,返回记录集ResultSet /{MH'
更新语句,返回数字,表示该更新影响的记录数 efkie}
ResultSet的方法 e=;@L3f
1、next(),将游标往后移动一行,如果成功返回true;否则返回false UN?T}p-
oF
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 C%?D E@k
Pq\V($gN
4、释放连接 Z?v6pjZ?
cn.close(); I+?$4SC
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u$,Wyi )L
rI66frbj
可滚动、更新的记录集 ,
gr&s+
1、创建可滚动、更新的Statement GVc[p\h(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /\uH[[s
该Statement取得的ResultSet就是可滚动的 ae#HA[\0G
2、创建PreparedStatement时指定参数 Qn)[1v
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 1fhK{9#
ResultSet.absolute(9000); QqK{~I|l
批量更新 zHc 4e
1、Statement `pAp[]SfQd
Statement sm = cn.createStatement(); )7"DR+;:
sm.addBatch(sql1); 2]RH)W86;
sm.addBatch(sql2); `(Q_ 65y
... bc=u1=~w
sm.executeBatch() ~K#_'Ldrd
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 @1-GPmj-
2、PreparedStatement m *bKy;'8
PreparedStatement ps = cn.preparedStatement(sql); xiOrk
{ qMdtJ(gq
ps.setXXX(1,xxx); xVz -_z
... dms:i)L2
ps.addBatch(); zV(tvt
} i~Ob( YIH
ps.executeBatch(); [(P[qEY
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <\9Ijuq}k
\
NSw<.
事务的处理 ~v(M6dz~vk
1、关闭Connection的自动提交 RQ)!KlY
cn.setAutoCommit(false); IfmIX+t?
2、执行一系列sql语句 9Bvn>+_K
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?]:EmP
Statement sm ; g yH7((#i
sm = cn.createStatement(insert into user...); sEJ;t0.LX
sm.executeUpdate(); -anFt+f-
sm.close(); dYew7
sm = cn.createStatement("insert into corp...); (zro7gKked
sm.executeUpdate(); ?r'TH/>
sm.close(); (VXx G/E3
3、提交 ];{l$-$$
cn.commit(); e5>5/l]jsg
4、如果发生异常,那么回滚 v6DxxE2n
cn.rollback();