java 数据库基本操作 aa:97w~s0
1、java数据库操作基本流程 !W^b:qjJ
2、几个常用的重要技巧: |~6X:
M61
可滚动、更新的记录集 z /
YF7wrx
批量更新 =z=$S]qN
事务处理 }w,^]fC:
wUd6xR
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 !jV}sp<Xp
1、取得数据库连接 R0 g-
1)用DriverManager取数据库连接 jK#[r[q{
例子 `L-GI{EJ
String className,url,uid,pwd; wEMh !jAbv
className = "oracle.jdbc.driver.OracleDriver"; p@/i e@DX
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; OS
X5S:XS
uid = "system"; ` 0YI?$G1
pwd = "manager"; jz\LI
Class.forName(className); ~"oxytJ
Connection cn = DriverManager.getConnection(url,uid,pwd); SBj9sFZ
2)用jndi(java的命名和目录服务)方式 ~|LlT^C
例子 $m.e}`7SF!
String jndi = "jdbc/db"; d[b(+sHp a
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); i2PPVT
DataSource ds = (DataSource) ctx.lookup(jndi); q#8$@*I
Connection cn = ds.getConnection(); ?5%0zMC
多用于jsp中 "y %S.ipWG
2、执行sql语句 :d&^//9
1)用Statement来执行sql语句 w(sD}YA)
String sql; {AJcYZV
Statement sm = cn.createStatement(); U1+X!&OCp
sm.executeQuery(sql); // 执行数据查询语句(select) s'&/8RR
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 7~t,Pt)
2)用PreparedStatement来执行sql语句 HzW`j"\
String sql; sCX 8
sql = "insert into user (id,name) values (?,?)"; RJ#xq#l
PreparedStatement ps = cn.prepareStatement(sql); Ha U6`IP
ps.setInt(1,xxx); 6[-N})
ps.setString(2,xxx); rPK)=[MZ
... !y8/El
ResultSet rs = ps.executeQuery(); // 查询 1^bI9 /
int c = ps.executeUpdate(); // 更新 _L?`C
YS}uJ&WoF
3、处理执行结果 [V\0P,l
查询语句,返回记录集ResultSet 1:3I G=
更新语句,返回数字,表示该更新影响的记录数 6LGy0dWpG
ResultSet的方法 w8|38m
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~w<u!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 hFDY2Cp]D
@O;gKFx
4、释放连接 "V|1w>s
cn.close(); =Q % F~
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,S|v>i,@
QLq^[>n
可滚动、更新的记录集 %UquF
1、创建可滚动、更新的Statement AE:IXP|c
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 82w='~y
该Statement取得的ResultSet就是可滚动的 _N4G[jQLJ
2、创建PreparedStatement时指定参数 &N{XLg>
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ,tdV-9N[O
ResultSet.absolute(9000); !n<vN@V*3d
批量更新 b%w?YR
1、Statement gNon*\a,-B
Statement sm = cn.createStatement(); xWY%-CWY.
sm.addBatch(sql1); K{]!hm,[3
sm.addBatch(sql2); D^(Nijl9U
... Mlr\#BO"9
sm.executeBatch() o%ZtE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Z.a`S~U
2、PreparedStatement JXG%Cx!2}
PreparedStatement ps = cn.preparedStatement(sql); %P!6cyQS
{ z(sfX}%
ps.setXXX(1,xxx); ?a~59!u
... VdrqbZ
ps.addBatch(); WoP5[.G
} OH2Xxr[bQ
ps.executeBatch(); n
H)6mOYp
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3)jFv7LAU
_#6_7=g@s6
事务的处理 sdk%~RN0T
1、关闭Connection的自动提交 /%E X4
W
cn.setAutoCommit(false); ),9^hJ1+@
2、执行一系列sql语句 >w,o|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &xKln1z'
Statement sm ; SE%B&8ZD
sm = cn.createStatement(insert into user...); ZPrL)']
sm.executeUpdate(); jV83%%e
sm.close(); I9xQ1WJc`
sm = cn.createStatement("insert into corp...); q*`1<9{H
sm.executeUpdate(); ,{"%-U#z
sm.close(); *VJT]^_
3、提交 $a'n{EP
cn.commit(); 2Zf}t
4、如果发生异常,那么回滚 E-P;3lS~
cn.rollback();