java 数据库基本操作 p-Btbhv
1、java数据库操作基本流程 00TdX|V`
2、几个常用的重要技巧: tfQq3 #
可滚动、更新的记录集 (HxF\#r?
批量更新 ^%^0x'"
事务处理 9jO+ew
U$Z}<8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 xb;mm9H
1、取得数据库连接 f ebh1rUX
1)用DriverManager取数据库连接 fe/6JV
例子 e8v=n@0
String className,url,uid,pwd; p$<qT^]&
className = "oracle.jdbc.driver.OracleDriver"; a06q-3zw
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %tLq&tyeY
uid = "system"; Jp0.h8i
pwd = "manager"; jXR+>=_
Class.forName(className); <rF
Connection cn = DriverManager.getConnection(url,uid,pwd); 7mBL#T2
2)用jndi(java的命名和目录服务)方式 >4b39/BM
例子 z5/O8}Gz@
String jndi = "jdbc/db"; </p.OaNe
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \]El%j4
DataSource ds = (DataSource) ctx.lookup(jndi); iHB)wC`u
Connection cn = ds.getConnection(); DVH><3FF
多用于jsp中 +.cv,1Vx
2、执行sql语句 |SleSgS<#
1)用Statement来执行sql语句 xb\:H@92
String sql; YJ$
=`lIM
Statement sm = cn.createStatement(); BD+?Ad?
sm.executeQuery(sql); // 执行数据查询语句(select) tT:yvU@a
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); U @|_5[nl
2)用PreparedStatement来执行sql语句 .|-y+9IP
String sql; G.T1rUh=
sql = "insert into user (id,name) values (?,?)"; !HYqM(|{.
PreparedStatement ps = cn.prepareStatement(sql); xcA:Q`c.{
ps.setInt(1,xxx); D$;/
l}s?
ps.setString(2,xxx); 89bKnsV
... }fZBP]<I(
ResultSet rs = ps.executeQuery(); // 查询 VCO/s9AL
int c = ps.executeUpdate(); // 更新 - %|I
<i-RF-*S
3、处理执行结果 l<?wB|1'
查询语句,返回记录集ResultSet NBX/V^
更新语句,返回数字,表示该更新影响的记录数 *Yw6UCO
ResultSet的方法 R#M).2::
1、next(),将游标往后移动一行,如果成功返回true;否则返回false wxxC&!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 F^-4Pyq@
@dNbL}qQ
4、释放连接 <5%We(3
cn.close(); htaLOTO;A
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection J;dFmZOk
u!W00;`L
可滚动、更新的记录集 iqeGy&F-
1、创建可滚动、更新的Statement }p~%GA.=98
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5"U7I{\
该Statement取得的ResultSet就是可滚动的 S y~ 1U
2、创建PreparedStatement时指定参数 K#@FKv|("
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); bv "S(
ResultSet.absolute(9000); DP_ \%(A
批量更新 jYv
!}
1、Statement vCM'nkXY
Statement sm = cn.createStatement(); 1YxI q565
sm.addBatch(sql1); 3$54*J
sm.addBatch(sql2); dQ]j
r.
...
q-#fuD^
sm.executeBatch() }: e9\r)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "/5b3^a
2、PreparedStatement [@;Z
xs
PreparedStatement ps = cn.preparedStatement(sql); c/RG1w
{ LJD"N#c
ps.setXXX(1,xxx); f&'md
... -5K/ cK
ps.addBatch(); 2X`M&)"X
} Yi`.zm
ps.executeBatch(); 1Jt%I'C?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 $.Ni'U
Er)b( Kk
事务的处理 4~4Hst#^
1、关闭Connection的自动提交 F<[8!^l(z
cn.setAutoCommit(false); n^K]R}S
2、执行一系列sql语句 %~~Q XH\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "'Ik{wGc
Statement sm ; vq}V0-
<
sm = cn.createStatement(insert into user...); J']W7!p
sm.executeUpdate(); 5>
UgBA
sm.close(); E2MpMR
sm = cn.createStatement("insert into corp...); aH_&=/-Tz
sm.executeUpdate(); Dp8(L ]6
sm.close(); S(pfd2^
3、提交 F+GQ l
cn.commit(); <S
qbj;
4、如果发生异常,那么回滚 b~}}{fm&f
cn.rollback();