java 数据库基本操作 KHTR oXt
1、java数据库操作基本流程 )Y](Mj!D
2、几个常用的重要技巧: EK%J%NY
可滚动、更新的记录集 ~_]i'ii8
批量更新 3nbTK3,
事务处理 1_B;r9x
u[<ij
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 hN U.y
1、取得数据库连接 Y(/y,bJ?jp
1)用DriverManager取数据库连接 k^{}p8;3
例子 SR$?pJh D%
String className,url,uid,pwd; >4^,[IO/
className = "oracle.jdbc.driver.OracleDriver"; $ dR@Q?_{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; INRP@Cp1
uid = "system"; U&'Xsz
pwd = "manager"; 8+n*S$
Class.forName(className); 0hpU9w}12
Connection cn = DriverManager.getConnection(url,uid,pwd); s}93nv*ez
2)用jndi(java的命名和目录服务)方式 tJa*(%Z?f
例子 \hO}3;*&
String jndi = "jdbc/db"; ) >H11o{&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); X
2Zp@q(
DataSource ds = (DataSource) ctx.lookup(jndi); p6&6^v\
Connection cn = ds.getConnection(); sLOkLz"x
多用于jsp中 ?Z2_y-
2、执行sql语句 ;39~G T
1)用Statement来执行sql语句 +UX~TT:
String sql; Htm;N2$d
Statement sm = cn.createStatement(); qCI0[U@
sm.executeQuery(sql); // 执行数据查询语句(select) 1]wo
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
(RBB0CE
2)用PreparedStatement来执行sql语句 wlEmy.)H
String sql; 2~y<l
sql = "insert into user (id,name) values (?,?)"; 5M?
I-m
PreparedStatement ps = cn.prepareStatement(sql); = tY%k!R
ps.setInt(1,xxx); L$3{L"/
ps.setString(2,xxx); 7csMk5NU'<
... Qm)c!
ResultSet rs = ps.executeQuery(); // 查询 S^:7V[=EgI
int c = ps.executeUpdate(); // 更新 ai]KH7
3>#io^35
3、处理执行结果 qir8RPW
查询语句,返回记录集ResultSet VfT@;B6ALF
更新语句,返回数字,表示该更新影响的记录数 1uJpn
ResultSet的方法 K9_@[}Ge
1、next(),将游标往后移动一行,如果成功返回true;否则返回false lhBu?q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 (J5M+K\H
u|sdQ
4、释放连接 E G J/r
cn.close(); A kEt=vI
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ayZWt| iHA
(r-8*)Qh8
可滚动、更新的记录集 dk_! ~Z
1、创建可滚动、更新的Statement wl0 i3)e:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); r<1.'F
该Statement取得的ResultSet就是可滚动的 /y3Lc.-
2、创建PreparedStatement时指定参数 A(1WQUu j
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); fU>4Ip1?y/
ResultSet.absolute(9000); `G<|5pe
批量更新 o9+fAH`D
1、Statement 5n1T7-QCL
Statement sm = cn.createStatement(); ?/YT,W<c;&
sm.addBatch(sql1); CPLsSv5
sm.addBatch(sql2); R,8460e7
... =kBWY9:$,
sm.executeBatch() C[[:/X(c
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0I}c|V'P
2、PreparedStatement (L,>P`CR6
PreparedStatement ps = cn.preparedStatement(sql); -cB>; f)5r
{ ]owcx=5q%'
ps.setXXX(1,xxx); ~kOXMLRg
... 2SXy)m
!
ps.addBatch(); Gxw>.O){
} 4p&YhV7j)o
ps.executeBatch(); .GiQC{@9w
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 |HQFqa<
nyx(0
事务的处理 blmY=/]
1、关闭Connection的自动提交 [-hsG E
cn.setAutoCommit(false);
PX5U)
2、执行一系列sql语句 "rcV?5?v~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Jyyr'1/<k
Statement sm ; *|S{%z9>
sm = cn.createStatement(insert into user...); 7,2#0Z`ge
sm.executeUpdate(); >_u5"&q
sm.close(); tWI%P&b
sm = cn.createStatement("insert into corp...); <]u]rZc$
sm.executeUpdate();
hOr4C4
sm.close(); 7D=gAMPvJ
3、提交 im@c||
cn.commit(); S<Uv/pn
4、如果发生异常,那么回滚 xX\A&9m
cn.rollback();