java 数据库基本操作 =H;'.!77Hx
1、java数据库操作基本流程 p'%S{v@5((
2、几个常用的重要技巧: .|hsn6i/-
可滚动、更新的记录集 |W=-/~X
批量更新 -vT{D$&1
事务处理 \-[bU6\A\
){'<67dK
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 2\z|/
Q
1、取得数据库连接 dW!El^w}
1)用DriverManager取数据库连接 "M[&4'OM
例子
zp}pS2DU
String className,url,uid,pwd; ]adgOlM
className = "oracle.jdbc.driver.OracleDriver"; ry=8Oq&[~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; L*,h=#x(
uid = "system"; H&p:
pwd = "manager"; Qox /abC
h
Class.forName(className); A s}L=2
Connection cn = DriverManager.getConnection(url,uid,pwd); 1;S?9N_B
2)用jndi(java的命名和目录服务)方式 'v
CMf
例子 & /T}
String jndi = "jdbc/db"; m;>G]Sbe
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); <Lxp t
DataSource ds = (DataSource) ctx.lookup(jndi); w{xa@Q]t-
Connection cn = ds.getConnection(); oe|;>0yf
多用于jsp中 4uMMf
2、执行sql语句 An0N'yo"Z
1)用Statement来执行sql语句 ty"L&$bf
String sql; Z4As'al
Statement sm = cn.createStatement(); %cUC~, g_(
sm.executeQuery(sql); // 执行数据查询语句(select) 00dY?d{[D
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]cS(2hP7
2)用PreparedStatement来执行sql语句 a)=|{QR>W
String sql; O< /b]<[
sql = "insert into user (id,name) values (?,?)"; kBrA ?
PreparedStatement ps = cn.prepareStatement(sql); F!u)8>s+z{
ps.setInt(1,xxx); IO
0nT
ps.setString(2,xxx); \aM-m:J
... myN2G?>;
ResultSet rs = ps.executeQuery(); // 查询 "T^%HPif
int c = ps.executeUpdate(); // 更新 9{j`eAUZl
lZ[J1:%
3、处理执行结果 >4kQ9lXL
查询语句,返回记录集ResultSet eZ[Qhrc
更新语句,返回数字,表示该更新影响的记录数 r2'K'?T3
ResultSet的方法 6fI2y4yEz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false L?j<KW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 <\Y(+?+uZ
41Q)w=hoN
4、释放连接 Et(H6O8
cn.close(); j
nSZ@u
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection H'/V<%
/j$pV
可滚动、更新的记录集 Al8Dw)uG{
1、创建可滚动、更新的Statement $ ~%Y}Xt*
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +6jGU'}[
该Statement取得的ResultSet就是可滚动的
q. Jx|x
2、创建PreparedStatement时指定参数 <X4f2z{T{@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); tx9%.)M:n
ResultSet.absolute(9000); Te?PYV-
批量更新 |;)_-=L0P
1、Statement >yn]h4M
Statement sm = cn.createStatement(); lt:&lIW,3
sm.addBatch(sql1); N}7b^0k
sm.addBatch(sql2); JBJ?|}5k4c
... u?MhK#Mr
sm.executeBatch() Hf_
pe
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 sn^ 3xAF
2、PreparedStatement .|07IH/Di{
PreparedStatement ps = cn.preparedStatement(sql); ~Y*.cGA
{ Ank_;jo
ps.setXXX(1,xxx); c7@/<*E+
... kv2o.q
ps.addBatch(); {fl[BX]kZ
} \I4Uj.'>\
ps.executeBatch(); W?E,"z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g4Dck4^!4
%@)q=*=y
事务的处理 O NcLhwH
1、关闭Connection的自动提交 }b}jw.2Wu
cn.setAutoCommit(false); \_R<Q?D+
2、执行一系列sql语句 aBY&]6^-
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close k{F6WQ7
Statement sm ; StTxga|
sm = cn.createStatement(insert into user...); DO*6gzW
sm.executeUpdate(); #4LTUVH
sm.close(); Op~:z<z
sm = cn.createStatement("insert into corp...); 7]5~ml3:
sm.executeUpdate(); w%)RX<h dI
sm.close(); u #}1
M
3、提交 e@Ev']
cn.commit(); PX&}g-M9
4、如果发生异常,那么回滚 1(# H%
cn.rollback();