java 数据库基本操作 G2qv)7{l2
1、java数据库操作基本流程 |0ATH`{
2、几个常用的重要技巧: "5
;fuM1
可滚动、更新的记录集 w^z5O6
批量更新 L#O1>
事务处理 3.+TM]RYN
.7&V@A7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 U{i xok
1、取得数据库连接 IR;l{q&`
1)用DriverManager取数据库连接 E! d?@Xr@
例子 q\s"B.(G"
String className,url,uid,pwd; NIgqdEu1
className = "oracle.jdbc.driver.OracleDriver"; 2t 6m#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; DmU,}]#:
uid = "system"; [ )3rc}:1
pwd = "manager"; */c4b:s
Class.forName(className); |y9(qcKn$
Connection cn = DriverManager.getConnection(url,uid,pwd); v+Eub;m
2)用jndi(java的命名和目录服务)方式 $`j%z@[g
例子 WX
.Ax$fT
String jndi = "jdbc/db"; Zc 9@G-
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K&ZN!VN/p
DataSource ds = (DataSource) ctx.lookup(jndi); } I>6 8dS[
Connection cn = ds.getConnection(); !C\$=\$
多用于jsp中 TOapq9B]
2、执行sql语句 GT.1,E,Vw
1)用Statement来执行sql语句 6&|hpp#[
String sql; 9gq+,g>E_
Statement sm = cn.createStatement(); J,4,#2M8
sm.executeQuery(sql); // 执行数据查询语句(select) [wU e"{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,ZGU\t
2)用PreparedStatement来执行sql语句 V=^B7a.;>
String sql; U\*]cw
sql = "insert into user (id,name) values (?,?)"; A0hKzj
PreparedStatement ps = cn.prepareStatement(sql); 6$CwH!42F
ps.setInt(1,xxx); (P!r^87
ps.setString(2,xxx); DW(
/[jo\
... fg$#ZCi
ResultSet rs = ps.executeQuery(); // 查询 }uZ/^_U.
int c = ps.executeUpdate(); // 更新 @$}Ct
pwvzs`[;
3、处理执行结果 eHHY.^|
查询语句,返回记录集ResultSet @k=UB&?I
更新语句,返回数字,表示该更新影响的记录数 0JFS%Yjw[
ResultSet的方法 &!P' M
1、next(),将游标往后移动一行,如果成功返回true;否则返回false X*cDn.(I
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &Va="HNKt
E{;F4wT_@
4、释放连接 Z8C~o)n9
cn.close(); L0l'4RRm\
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection {wy{L-X
PRJ
可滚动、更新的记录集 8[b_E5!V
1、创建可滚动、更新的Statement umT *
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9|D*}OY>
该Statement取得的ResultSet就是可滚动的 >|X )
2、创建PreparedStatement时指定参数 Q":,oZ2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); D:] QBA)C
ResultSet.absolute(9000); wE[gp+X~
批量更新 yPrF2@#XZ/
1、Statement Sq&r
;
Statement sm = cn.createStatement(); _'8P8T&
sm.addBatch(sql1); J':X$>E|
sm.addBatch(sql2); E5aRTDLq
... K;z$~;F
sm.executeBatch() (E;+E\E
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Ez8k.]q u
2、PreparedStatement *+OS;R1<
PreparedStatement ps = cn.preparedStatement(sql); |`ya+/ff+
{ =yF]#>Ah
ps.setXXX(1,xxx); :V3z`}Rl
... za%gD
ps.addBatch(); :)Pj()Os|
} N0DzFXp
ps.executeBatch(); H )51J:4
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Y5CDdn
l~]D|92
事务的处理 l-Be5?|{_
1、关闭Connection的自动提交 ]p8zT|bv
cn.setAutoCommit(false); *
N]^(+/A
2、执行一系列sql语句 SZ29B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close l+#J oc<8
Statement sm ; 0iYo&q'n
sm = cn.createStatement(insert into user...); _01wRsm%2
sm.executeUpdate(); nb<e<>L
sm.close(); jme`Tyd
sm = cn.createStatement("insert into corp...); 0~~yYo&
sm.executeUpdate(); T;G<62`.h
sm.close(); wz'=
3、提交
d^=9YRc
cn.commit(); Ul_5"3ze
4、如果发生异常,那么回滚 #M%K82"
cn.rollback();