java 数据库基本操作 ]Jx_bs~g
1、java数据库操作基本流程 'EkuCL
2、几个常用的重要技巧: 5<h:kZ"S^g
可滚动、更新的记录集 ]E}eM@xdD
批量更新 }\hz@G<
事务处理 p JM&R<i:
`(lD]o{,s
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {4HcecT
1、取得数据库连接 DkeFDzQ5
1)用DriverManager取数据库连接 E6s)J -a
例子 I+']av8e
String className,url,uid,pwd; tZ_D.syBAc
className = "oracle.jdbc.driver.OracleDriver"; B1(T-pr
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7uxUqM
uid = "system"; .%x%(olf
pwd = "manager"; V-w{~
Class.forName(className); Y]:Ch (Q
Connection cn = DriverManager.getConnection(url,uid,pwd); d\j[O9W>
2)用jndi(java的命名和目录服务)方式 Tu_4kUCR!f
例子 L IRdWGQ4
String jndi = "jdbc/db"; Vae=Yg=fw
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); iJ!p9E*(
DataSource ds = (DataSource) ctx.lookup(jndi); k/2TvEV3=
Connection cn = ds.getConnection(); ngC^@*XAw9
多用于jsp中 0E/,l``p
2、执行sql语句 ^?-wov$
1)用Statement来执行sql语句 4-~S"T8<u
String sql; w)xfP^M#
Statement sm = cn.createStatement(); i
3i
sm.executeQuery(sql); // 执行数据查询语句(select) {6gY6X-R
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); m-MfFEZ
2)用PreparedStatement来执行sql语句 "aJfW
String sql; Q;0g
sql = "insert into user (id,name) values (?,?)"; th`pf
PreparedStatement ps = cn.prepareStatement(sql); }BJR/r
ps.setInt(1,xxx); D>
E N:_v
ps.setString(2,xxx); P8n |MN
... ,]_<8@R
ResultSet rs = ps.executeQuery(); // 查询 p\ _&
int c = ps.executeUpdate(); // 更新 T!Z).PA#
,HtXD~N
3、处理执行结果 3D2i32Y@!
查询语句,返回记录集ResultSet }C<$q
更新语句,返回数字,表示该更新影响的记录数 9UE)4*5
ResultSet的方法 7~m[:Eg6[s
1、next(),将游标往后移动一行,如果成功返回true;否则返回false v)%0`%nSR
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %>!$eCX
R 9b0D>Lxt
4、释放连接 I7Xm~w!{qk
cn.close(); bSj-xxB]e
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection JNxrs~}
Q ?R3aJ
可滚动、更新的记录集 Y [%<s/
1、创建可滚动、更新的Statement
} @4by<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 2OsS+6,[x
该Statement取得的ResultSet就是可滚动的 !6*m<#Qm
2、创建PreparedStatement时指定参数 W>y&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ]jgMN7
ResultSet.absolute(9000); '))K'
u
批量更新 /#g
P#Z%
1、Statement b;IzK'
Statement sm = cn.createStatement(); J)._&O$
sm.addBatch(sql1); 0Q!/A5z
sm.addBatch(sql2); !YENJJ
... cN%@
nW0i
sm.executeBatch() KK,
t !a
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 -xL^UcG0
2、PreparedStatement |wGmu&fY
PreparedStatement ps = cn.preparedStatement(sql); EClx+tz;`
{ F-%Hw
ps.setXXX(1,xxx); -SUK [<=X
... aXh~w<5F
ps.addBatch(); h8hyQd$!
} <N,:w`g#
ps.executeBatch(); L-[A1#n
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @!p0<&R@x
l-?#oy
事务的处理 DAf0bh"
1、关闭Connection的自动提交 jhH&}d9
cn.setAutoCommit(false); ) m(!lDz3
2、执行一系列sql语句 g+3_ $qIQ+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close tX~*.W:
Statement sm ; *NCkC
~4
sm = cn.createStatement(insert into user...); R^&.:;Wi>
sm.executeUpdate(); 2"IDz01ne
sm.close(); \Sv8c}8
sm = cn.createStatement("insert into corp...); L'u*WHj|v
sm.executeUpdate(); <HH\VG\H6
sm.close(); dheobD
3、提交 /Csk"IfuO
cn.commit(); S9%ZeM+
4、如果发生异常,那么回滚 @K1'Q!S*
cn.rollback();