java 数据库基本操作 .7|kxJq
1、java数据库操作基本流程 YAvOV-L
2、几个常用的重要技巧: gLyE,1Z}u
可滚动、更新的记录集 18xT2f
批量更新 dO{a!Ca
事务处理 quPNwNy
GYq.!d@O
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 +hJ@w-u,G
1、取得数据库连接 SQ_w~'(
1)用DriverManager取数据库连接 _RHB ^y;-
例子 )ZcwG(o0
String className,url,uid,pwd; @6N$!Q?
className = "oracle.jdbc.driver.OracleDriver"; ?pF7g$>q
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .(7end<
uid = "system"; ?7Y6: zo$^
pwd = "manager"; 5#|f:M]Bo|
Class.forName(className); ]N\J~Gm
Connection cn = DriverManager.getConnection(url,uid,pwd); - 9Ll'fbq
2)用jndi(java的命名和目录服务)方式 <^APq8>
例子
hZ ve8J
String jndi = "jdbc/db"; dP0%<Q|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); QX]~|?q
DataSource ds = (DataSource) ctx.lookup(jndi); t%`GXJb
Connection cn = ds.getConnection(); t[ Zoe+&
多用于jsp中 {|;5P.,l
2、执行sql语句 sfv{z!mo
1)用Statement来执行sql语句 <ETR6r
String sql; d0Jaa1b~O
Statement sm = cn.createStatement(); bCv^za]P6
sm.executeQuery(sql); // 执行数据查询语句(select) f""+jc1
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); cM= ?{W7~
2)用PreparedStatement来执行sql语句 ?Z]5
[
String sql; |@a.dgz,
sql = "insert into user (id,name) values (?,?)"; /i${ [1
PreparedStatement ps = cn.prepareStatement(sql); ;E"TOC
ps.setInt(1,xxx); tocZO
ps.setString(2,xxx); ?'@tx4#v\2
... d1"%sI
ResultSet rs = ps.executeQuery(); // 查询 3j]P\T
int c = ps.executeUpdate(); // 更新 }5 2]
a=m7pe^
3、处理执行结果 xTy[X"sJ
查询语句,返回记录集ResultSet yMQZulCWE
更新语句,返回数字,表示该更新影响的记录数 xzqgem`[\
ResultSet的方法 \,b@^W6e>
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @.PVUP
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *Z+8L*k97
jI-\~
4、释放连接 ]Ywj@-*q
cn.close(); `H_.<``>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection P2q'P&
`pHlGbrW
可滚动、更新的记录集 LZ97nvK
1、创建可滚动、更新的Statement km)5?
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .fQ/a`AsU
该Statement取得的ResultSet就是可滚动的 4!%TY4bJ
2、创建PreparedStatement时指定参数 HR/"Nwr
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); XpFoSW#K
ResultSet.absolute(9000); E7_)P>aS5
批量更新 HH\6gs]u
1、Statement b?p_mQKtZ
Statement sm = cn.createStatement(); @213KmB.
sm.addBatch(sql1); IwE{Zvr
sm.addBatch(sql2); <0Mc\wy
... V8aLPJ0_
sm.executeBatch() ((2 g
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 NaR/IsN8%
2、PreparedStatement 2W}f|\8MX
PreparedStatement ps = cn.preparedStatement(sql); 3M;[.b
{ 7nzNBtk
ps.setXXX(1,xxx); C;u8qVI
... `eF&|3!IYQ
ps.addBatch(); 4z_ >CiA
} 9{{|P=
ps.executeBatch(); J73B$0FP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 aetK<9L$
dW32O2@-
事务的处理 /GzA89N(
1、关闭Connection的自动提交 Ly?%RmHK
cn.setAutoCommit(false); *@XJ7G[
2、执行一系列sql语句 Mn-f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =`8%qh
Statement sm ; Z#+{ksU
sm = cn.createStatement(insert into user...); lHV&8fny
sm.executeUpdate(); rj.]M6#
sm.close(); |
JmEI9n2
sm = cn.createStatement("insert into corp...); aaN|g{pX
sm.executeUpdate(); ] Q 'Ed
sm.close(); 7 +RsZu
3、提交 Ddf7wszW
cn.commit();
[a\U8
w
4、如果发生异常,那么回滚 vS! TnmF
cn.rollback();