java 数据库基本操作 ;&!dD6N
1、java数据库操作基本流程 B)Q'a3d#
2、几个常用的重要技巧: rODKM-7+
可滚动、更新的记录集 \fKE~61
批量更新 `P5"5N\h
事务处理 .~U9*5d
l46F3C|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 0/gcSW
b
1、取得数据库连接 ;Pa(nUE@
1)用DriverManager取数据库连接 *=7[Ip<X
例子 6'%]6"&M4
String className,url,uid,pwd; e"CLhaT
className = "oracle.jdbc.driver.OracleDriver"; +-nQ,
fOV
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ,pASjFWi
uid = "system"; Ax^'unfQ:
pwd = "manager"; Ji!-G4.n"
Class.forName(className); 1%@~J\qF
Connection cn = DriverManager.getConnection(url,uid,pwd); tQ~B!j]
2)用jndi(java的命名和目录服务)方式 ~ 9;GD4
例子 _-&.=3\1
String jndi = "jdbc/db"; IID(mmy6
L
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); J7_H.RPa
DataSource ds = (DataSource) ctx.lookup(jndi); !:t9{z{Ixg
Connection cn = ds.getConnection(); |i`@!NrFL
多用于jsp中 E&+^H
on
2、执行sql语句 "P{&UwMmh
1)用Statement来执行sql语句 u
.2sB6}
String sql; W$JA4O>b
Statement sm = cn.createStatement(); 'MUrszOO.e
sm.executeQuery(sql); // 执行数据查询语句(select) qc6IH9i`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %yMzgk[u
2)用PreparedStatement来执行sql语句 `-H:j:U{
String sql; ?W
n(ciO
sql = "insert into user (id,name) values (?,?)"; :65HMWy.
PreparedStatement ps = cn.prepareStatement(sql); (6BCFl:/Q<
ps.setInt(1,xxx); *e6|SZ &3
ps.setString(2,xxx); ger<JSL%
... 1pb;A;F,A
ResultSet rs = ps.executeQuery(); // 查询 6\3k0z
int c = ps.executeUpdate(); // 更新 jVINc=o
K*Jtyy}r
3、处理执行结果 K|G$s
查询语句,返回记录集ResultSet ja;5:=8A5
更新语句,返回数字,表示该更新影响的记录数 Vi#im`@
ResultSet的方法 >>$|,Q-.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [tzSr=,Cg
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 {K9E% ,w
c Vn+~m_%
4、释放连接 S
|x)7NC
cn.close(); FZnHG;af
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection M: "ci;*$
rl%Kn^JJ~
可滚动、更新的记录集 9>R|k$`
1、创建可滚动、更新的Statement 6EU4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \vsrBM
该Statement取得的ResultSet就是可滚动的 5gD)2Q6
2、创建PreparedStatement时指定参数 Y/0O9}hf
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
j>*SJtq7
ResultSet.absolute(9000); $Jm2,Yv
批量更新 =.E(p)fz
1、Statement [bv@qBL
Statement sm = cn.createStatement(); 9@Sb! 9h
sm.addBatch(sql1); %20-^&zZ
sm.addBatch(sql2); n6G&^Oj
... =BS'oBn^6
sm.executeBatch() XQOprIJ
U
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 SSLshY~d
2、PreparedStatement ^qx\ e$R
PreparedStatement ps = cn.preparedStatement(sql); a{*'pY(R0$
{ Z5Ihc%J^
ps.setXXX(1,xxx);
_)E8XyzF
... qm=F6*@}
ps.addBatch(); 0xUj#)
} @izi2ND
ps.executeBatch(); Q)BoWd
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 j dhml%pAd
f#kevf9zc
事务的处理 mzB#O;3=
1、关闭Connection的自动提交 pqN[G=0
cn.setAutoCommit(false); uS#Cb+*F
2、执行一系列sql语句 K=x1mM+RK
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close IKDjatn
Statement sm ; F[=lA"F^
sm = cn.createStatement(insert into user...); oRThJ B
sm.executeUpdate(); [7 `Dgnmq
sm.close(); tgtoK|.
sm = cn.createStatement("insert into corp...); FRt/{(jro
sm.executeUpdate(); Zk#i9[g9*
sm.close(); y] ]Vp~R:[
3、提交 ^Cn]+0G#C8
cn.commit(); ff1B)e
4、如果发生异常,那么回滚 HoE.//b
cn.rollback();