java 数据库基本操作 H]X)@n>
1、java数据库操作基本流程 P$I\)Q H
2、几个常用的重要技巧: m5{SPa,y
可滚动、更新的记录集 HCK4h DKo}
批量更新 bp,CvQ'}a
事务处理 EdpR| z
1PSb72h<
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 >.\E'e5^C
1、取得数据库连接 M7 !"
t
1)用DriverManager取数据库连接 q|J]
例子 BUyA]
String className,url,uid,pwd; --kK<9J7
className = "oracle.jdbc.driver.OracleDriver"; sKO
;p
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; )zo ;r!eP
uid = "system"; I#U44+c
pwd = "manager"; j83
V$
Le
Class.forName(className); Q>$L;1E*,
Connection cn = DriverManager.getConnection(url,uid,pwd); ]EQ/*ct
2)用jndi(java的命名和目录服务)方式 yk2j&}M
例子 3(5Y-.aK}^
String jndi = "jdbc/db"; 9<S-b |!@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); D9en
DataSource ds = (DataSource) ctx.lookup(jndi); mM.&c5U
Connection cn = ds.getConnection(); 9G~P)Z!0
多用于jsp中 [dMxr9M
2、执行sql语句 ]XU#i#;c
1)用Statement来执行sql语句 q=6Y2Q
String sql; n TG|Isa
Statement sm = cn.createStatement(); 8t%1x|!
sm.executeQuery(sql); // 执行数据查询语句(select) @4$E.q<0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); +$5^+C\6A
2)用PreparedStatement来执行sql语句 K<GCP2
String sql; W6Pg:Il7
sql = "insert into user (id,name) values (?,?)"; t/|^Nt@XT
PreparedStatement ps = cn.prepareStatement(sql); Di*>PE@
ps.setInt(1,xxx); >kYyR.p.b
ps.setString(2,xxx); Je,8{J |e
... 4NV1v&"
ResultSet rs = ps.executeQuery(); // 查询 S##W_OlrI
int c = ps.executeUpdate(); // 更新 fF%r$`2
G>x0}c
3、处理执行结果 ~55>uw<
查询语句,返回记录集ResultSet `2B+8,{%
更新语句,返回数字,表示该更新影响的记录数 BxF
ResultSet的方法 dp_q:P4;B
1、next(),将游标往后移动一行,如果成功返回true;否则返回false soF ^G21N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 g 7X>i:
,dBI=D'
4、释放连接 m='OnTeOE
cn.close(); 4<|u~n*JF
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection {SV$fl;
zdCt#=QV?R
可滚动、更新的记录集 -eTGRr
1、创建可滚动、更新的Statement JK4 @
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7(H/|2;-d8
该Statement取得的ResultSet就是可滚动的 zYgLGwi{
2、创建PreparedStatement时指定参数 zeX?]@]Y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); GCHssw~P'v
ResultSet.absolute(9000); yFG&Ir
批量更新 ?t-2oLE
1、Statement bX,Z<BvbF
Statement sm = cn.createStatement(); x%1Rp[
sm.addBatch(sql1); M3%<kk-_
sm.addBatch(sql2); 'mF}+v^
... ;G$FLL1
sm.executeBatch() yrw!b\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 fJuJ#MX{:
2、PreparedStatement JFfx9%Fq
PreparedStatement ps = cn.preparedStatement(sql); R<-KXT9
{ &3<]FK
ps.setXXX(1,xxx); &!ZpBR(
... M:x(_Lu
ps.addBatch(); v;SJgZK
} 8J} J;Ga
ps.executeBatch(); 2 E^P=jU`
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 lgl/|
^ Uw
-IE;5f#e
事务的处理 d9s"y?8
1、关闭Connection的自动提交 sZc<h]L(g
cn.setAutoCommit(false); Y%3j>_\;
2、执行一系列sql语句 <d4^gAfs*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close *d(Dk*(
Statement sm ; ScEM#9T |
sm = cn.createStatement(insert into user...); Z_%>yqDC
sm.executeUpdate(); Wxjpe4
sm.close(); ]P.S5s'
sm = cn.createStatement("insert into corp...); Ch3##-
sm.executeUpdate(); U/>5C:
sm.close(); +xMDm_TGLA
3、提交 kDsUKO
p
cn.commit(); #]rw@c
4、如果发生异常,那么回滚 Ab`G b
cn.rollback();