java 数据库基本操作 c:T P7"vG
1、java数据库操作基本流程 -6>rR{z
2、几个常用的重要技巧: i i
Y[
可滚动、更新的记录集 =c4U%d2
批量更新 ?K#$81;[
事务处理 u9(AT>HxT
fXj
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?^p8]Va%
1、取得数据库连接 -]%@,L^@
1)用DriverManager取数据库连接 (5
hu
W7v
例子 ?sE21m?b-
String className,url,uid,pwd; ;zODp+4@Q
className = "oracle.jdbc.driver.OracleDriver"; ;wZ.p"T9^
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Yd'ke,Je
uid = "system"; GK+w1%6)
pwd = "manager"; h08T Q=n
Class.forName(className); Vo[4\h#$
Connection cn = DriverManager.getConnection(url,uid,pwd); v<W++X7z
2)用jndi(java的命名和目录服务)方式 k=}hY+/=
例子 I^=M>_s4
String jndi = "jdbc/db"; LLiX%XOh
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); cB^lSmu5
DataSource ds = (DataSource) ctx.lookup(jndi); !hUyX}{`j
Connection cn = ds.getConnection(); ^<-SW]x
多用于jsp中 g^FH[(P[G
2、执行sql语句 <D}k@M
Z
1)用Statement来执行sql语句 j*}xe'#
String sql; "H8N,eb2
Statement sm = cn.createStatement(); `PfC:L
sm.executeQuery(sql); // 执行数据查询语句(select) 8wOPpdc
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); >E3OYa?G
2)用PreparedStatement来执行sql语句 uDR(^T{g#
String sql; Vv]mME@
sql = "insert into user (id,name) values (?,?)"; _nUuiB>
PreparedStatement ps = cn.prepareStatement(sql); r>\.b{wI
ps.setInt(1,xxx); qS>el3G
ps.setString(2,xxx); vr$[
... X*@Sj;|m
ResultSet rs = ps.executeQuery(); // 查询 sXA=KD8
int c = ps.executeUpdate(); // 更新 >b0}X)Z+U
NG ~sE&,7
3、处理执行结果 %Ok.XBS)
查询语句,返回记录集ResultSet 3;AAC (X
更新语句,返回数字,表示该更新影响的记录数 IV76#jL
ResultSet的方法 t [f]
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Yhfk{ CI
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 nM#\4Q[}Jh
%"D-1&%zY
4、释放连接 qW*)]s)z
cn.close(); Jh1fM`kB5K
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection \oyr[so(i
oID,PB*9
可滚动、更新的记录集 G6FknYj
1、创建可滚动、更新的Statement 7o3f5"z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); %y'#@%kO:S
该Statement取得的ResultSet就是可滚动的 P$Nwf,d2u
2、创建PreparedStatement时指定参数 S"*wP[d.9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); hz!.|U@,{<
ResultSet.absolute(9000); p)`JVq,H/B
批量更新 G"]'`2.m
1、Statement Ktoxl+I?
Statement sm = cn.createStatement(); c;VW>&,B
sm.addBatch(sql1); +m_quQ/ys
sm.addBatch(sql2); sHNt>5p
... "\30YO>\
sm.executeBatch() /n_N`VJ7H
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ;TYkJH"
2、PreparedStatement K=V)"v5o3
PreparedStatement ps = cn.preparedStatement(sql); -O\`G<s%
{ IIzdCa{l
ps.setXXX(1,xxx); 1:?WvDN=
... D?$f[+
ps.addBatch(); C
7v
8
} EyhQjsaT
ps.executeBatch(); IsI\T8yfc
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @<_4Nb
Gmc0yRN
事务的处理 2!A/]:[F
1、关闭Connection的自动提交 I/ c*
?
cn.setAutoCommit(false); >354O6
2、执行一系列sql语句 1r$q $\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close V}&
Statement sm ; _("{fJ,A
sm = cn.createStatement(insert into user...); h-V5&em"_
sm.executeUpdate(); H'+P7*k#M
sm.close(); nCt:n}+C7
sm = cn.createStatement("insert into corp...); }2}hH0R
sm.executeUpdate(); tcfUhSz,I
sm.close(); 13Q|p,^R
3、提交 .- {B
cn.commit(); wT;D<rqe`
4、如果发生异常,那么回滚 tJc9R2
cn.rollback();