java 数据库基本操作
J&?kezs
1、java数据库操作基本流程 &N#)(rQ1
2、几个常用的重要技巧: 5y)kQ<x"
可滚动、更新的记录集 f{J7a1 `_
批量更新 "(5}=T@,
事务处理 >;Bhl|r~z
F&\o1g-L
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {XAKf_Cg
1、取得数据库连接 h0`)=
1)用DriverManager取数据库连接 "T'!cy
例子 ?{n#j,v!
String className,url,uid,pwd; sC$X7h(Q+
className = "oracle.jdbc.driver.OracleDriver"; q&.!*rPD
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; xFJ>s-g*
uid = "system"; kF5}S8B
pwd = "manager"; xiiZ'U
Class.forName(className); p ,!`8c6
Connection cn = DriverManager.getConnection(url,uid,pwd); ;Mc}If*
2)用jndi(java的命名和目录服务)方式 P%.5xYn
例子 CfAqMH*ip
String jndi = "jdbc/db"; 0t~--/lA
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); x8H)m+AW
DataSource ds = (DataSource) ctx.lookup(jndi);
Hi9]M3Ub
Connection cn = ds.getConnection(); ;J:YNup
多用于jsp中 p81~Lk*Hz@
2、执行sql语句 JBqzQ^[n
1)用Statement来执行sql语句 j EX([J1
String sql; 4xlsdq8`t
Statement sm = cn.createStatement(); P_;oSN|>
sm.executeQuery(sql); // 执行数据查询语句(select) LZeR.8XM>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;rFa I^
2)用PreparedStatement来执行sql语句 $KiA~l
String sql; E-/]UH3u H
sql = "insert into user (id,name) values (?,?)"; ;RrfE8mGj
PreparedStatement ps = cn.prepareStatement(sql); q&+GpR
ps.setInt(1,xxx); 6*e:ey U
ps.setString(2,xxx); *?uF&( 0
... E,;nx^`!l
ResultSet rs = ps.executeQuery(); // 查询 |^=`ln!
int c = ps.executeUpdate(); // 更新 Djzb#M'm
k;)L-ge9
3、处理执行结果 \ l:n
查询语句,返回记录集ResultSet f?]cW h%
更新语句,返回数字,表示该更新影响的记录数 R'{V&H^Z
ResultSet的方法 UY==1\
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @U&|38
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ZE :oK
Deam%)bXM]
4、释放连接 b~|B(lL6Xm
cn.close(); au8)G_A
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2XE4w# [j
r"n)I$
可滚动、更新的记录集 hZpFI?lqc\
1、创建可滚动、更新的Statement []@Mk
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); zIL.R#|D=
该Statement取得的ResultSet就是可滚动的 {3;4=R3
2、创建PreparedStatement时指定参数 W&"FejD
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); f; 22viE
ResultSet.absolute(9000); ~6OdPD
批量更新 m?csake.Me
1、Statement wiutUb
Y
Statement sm = cn.createStatement(); GVg0)}
sm.addBatch(sql1); X9P-fF?0
sm.addBatch(sql2); PBUc9/
... )a.U|[:y[+
sm.executeBatch() .8,lhcpY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !,\]> c
2、PreparedStatement N=wB1gJ
PreparedStatement ps = cn.preparedStatement(sql); F8pLA@7[
{ g><sZqj8tt
ps.setXXX(1,xxx); F4k`x/ak
... ^ PD a
ps.addBatch(); ie_wJ=s
} |HL1.;1
ps.executeBatch(); IE|$>q0Z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !rXyw`6N
v(afaN
事务的处理 Fv3fad@x
1、关闭Connection的自动提交 #R)$nv:h?^
cn.setAutoCommit(false); {C<ch@sR
2、执行一系列sql语句 L.8-nTg"y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close s)-=l_4T
Statement sm ; <EE)d@%>v
sm = cn.createStatement(insert into user...); K
<0ItNv
sm.executeUpdate(); p1Els/|
sm.close(); WUHijHo5(8
sm = cn.createStatement("insert into corp...); UE(%R1Py
sm.executeUpdate(); 9@!`,Co
sm.close(); b[/-lNrc
3、提交 'a0$74f z
cn.commit(); z- ()7WY
4、如果发生异常,那么回滚 5VISP4a
cn.rollback();