java 数据库基本操作 M1sR+e$"
1、java数据库操作基本流程 IW1+^F9NEw
2、几个常用的重要技巧: ?jDdF
可滚动、更新的记录集 R,'`
A.Kk
批量更新 GNIZHyT(O
事务处理 vXA+4 ?ZG
>^!qxb-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 x<-n}VK\
1、取得数据库连接
equTKM
1)用DriverManager取数据库连接 8T2iqqG/1
例子 kS@6'5U
String className,url,uid,pwd; pMfP3G7V
className = "oracle.jdbc.driver.OracleDriver"; S9'8rn!_
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $cUTe
uid = "system"; X=Th
pwd = "manager"; G"~%[k
Class.forName(className); 6,D)o/_
Connection cn = DriverManager.getConnection(url,uid,pwd); Uz&XqjS
2)用jndi(java的命名和目录服务)方式 = @UgCu>=
例子 N8s2v W
String jndi = "jdbc/db"; Oy,`tG0
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); No1*~EQ
DataSource ds = (DataSource) ctx.lookup(jndi); MK*WStY
Connection cn = ds.getConnection(); ^71!.b%
多用于jsp中 lN<,<'&^.
2、执行sql语句 VXpbmg!{S
1)用Statement来执行sql语句 P%- @AmO^_
String sql; n
qR8uL>
Statement sm = cn.createStatement(); ND3(oes+;K
sm.executeQuery(sql); // 执行数据查询语句(select) 8,(FJ7OCT,
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); fCq
2)用PreparedStatement来执行sql语句 D02_ Jrg
String sql; 0VOj,)K=
sql = "insert into user (id,name) values (?,?)"; GOx+%`.R\
PreparedStatement ps = cn.prepareStatement(sql); gp/_# QVWC
ps.setInt(1,xxx); 8LH"j(H
ps.setString(2,xxx); $xWebz0
... :())%Xu3
ResultSet rs = ps.executeQuery(); // 查询 qg(rG5kD@
int c = ps.executeUpdate(); // 更新 X9d~r_2&m<
/61P`1y(J
3、处理执行结果 D{4Ehr "T
查询语句,返回记录集ResultSet JDIQpO"Qji
更新语句,返回数字,表示该更新影响的记录数 cc"L> XoK
ResultSet的方法 J#pl7q)^w
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "gR W91
T
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3*DwXH +
w=r3QKm#K
4、释放连接 lQnl6j
cn.close(); U!0 Qf7D
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 0%9Nf!j
iyRB}[y
可滚动、更新的记录集 .Y?/J,Ch
1、创建可滚动、更新的Statement AxXFzMW
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .7!n%Ks
该Statement取得的ResultSet就是可滚动的 7Z(F-B
+j
2、创建PreparedStatement时指定参数 1 >nl ]yO
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); FzDZ<dJ
ResultSet.absolute(9000); r dc}e"v
批量更新 P[.BK
1、Statement |kUxTe
Statement sm = cn.createStatement(); d]v4`nc
sm.addBatch(sql1); _-vf<QO]
sm.addBatch(sql2); /p=9"?
... !+E|{Zj
sm.executeBatch() q66+x)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 LOD'iiH6
2、PreparedStatement kg>Ymo.
PreparedStatement ps = cn.preparedStatement(sql); ae)0Yu`*G7
{ UHtxzp =[
ps.setXXX(1,xxx); \Lz2"JI
... BZXP%{njS
ps.addBatch(); #b~wIOR)Z
} Llf |fayq
ps.executeBatch(); ed,w-;(n~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 >@2l/x8;
Dn6 k,nVh
事务的处理 s[V$fvW
1、关闭Connection的自动提交 <By6%<JTn
cn.setAutoCommit(false); p8>.Q/4
2、执行一系列sql语句 ?ah<Qf]
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =ZsM[wd
Statement sm ; MZ(TST"
sm = cn.createStatement(insert into user...); q+MV@8w
sm.executeUpdate(); M>mk=-l
sm.close(); v}=3
sm = cn.createStatement("insert into corp...); b9ON[qOMN
sm.executeUpdate(); {\OIowa
sm.close(); Jl"),;Od
3、提交 blwdcdh
cn.commit(); > n~l\
fC
4、如果发生异常,那么回滚 e7{n=M
cn.rollback();