java 数据库基本操作 YA^wUx
1、java数据库操作基本流程 ]v^`+s}3
2、几个常用的重要技巧: bMqu5G_q
可滚动、更新的记录集 1^x2WlUm4
批量更新 E&iWtwkz
事务处理 wZ]BY;
.gM>FUH3L
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 e_>rJWI}
1、取得数据库连接 uhC=
1)用DriverManager取数据库连接 Ww'TCWk@
例子 r?5@Etpg
String className,url,uid,pwd; u/!mN2{Rd
className = "oracle.jdbc.driver.OracleDriver"; !\&7oAs=I
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; )MD*)O
uid = "system"; }Ll3AR7\
pwd = "manager"; XvA0nEi
Class.forName(className); &{%S0\K Y
Connection cn = DriverManager.getConnection(url,uid,pwd); `L"p)5H
2)用jndi(java的命名和目录服务)方式 e~t}z_>F
例子 :"<B@Z
String jndi = "jdbc/db"; c5B_WqjJ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 7kX7\[zN
DataSource ds = (DataSource) ctx.lookup(jndi); #U!(I#^3
Connection cn = ds.getConnection(); BuEQ^[Ex
多用于jsp中 @R'g@+{I
2、执行sql语句 c5=v`hv
1)用Statement来执行sql语句 aCUV[CPw
String sql; 5|6z1{g8
Statement sm = cn.createStatement(); ."!8B9s
sm.executeQuery(sql); // 执行数据查询语句(select) PBAz`y2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); YL9t3]
2)用PreparedStatement来执行sql语句 Lilk8|?#W
String sql; 282+1X
sql = "insert into user (id,name) values (?,?)"; ^EuyvftZ
PreparedStatement ps = cn.prepareStatement(sql); os(Jr!p_=
ps.setInt(1,xxx); shDt&_n
ps.setString(2,xxx); HjUw[Yz+6
... JR a*;_
ResultSet rs = ps.executeQuery(); // 查询 (}~eD
int c = ps.executeUpdate(); // 更新 wCq)w=,
nIT ^'
3、处理执行结果 Kc9mI>u H
查询语句,返回记录集ResultSet ~G{$ P'[
更新语句,返回数字,表示该更新影响的记录数 WnJLX ^;
ResultSet的方法 8)-t91hkL
1、next(),将游标往后移动一行,如果成功返回true;否则返回false vYMbson}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6XOpB^@
XY+aunLf
4、释放连接 G"U>fwFuK
cn.close(); 3Q*RR"3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection uZ0 $s$
SRG!G]?-
可滚动、更新的记录集 St3(1mApl
1、创建可滚动、更新的Statement WkDn
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); tRUsZl
该Statement取得的ResultSet就是可滚动的 6t7;}t]t
2、创建PreparedStatement时指定参数 >+;
b>
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); pZ_FVID
ResultSet.absolute(9000); (!>g8=`"
批量更新 Pv2nV!X6
1、Statement %8}ksl07
Statement sm = cn.createStatement(); 7u`}t83a
sm.addBatch(sql1); #hE3~+i
sm.addBatch(sql2); W
&0@&U
... XJxs4a1[t
sm.executeBatch() G%p!os\>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :WfB!4%!
2、PreparedStatement B1d%#
PreparedStatement ps = cn.preparedStatement(sql); !(ux.T0
{ >Dp6@%
ps.setXXX(1,xxx); X^
^?}>t[
... ^zWO[$n}tP
ps.addBatch(); }%>$}4 ,
} IjB*myN.
ps.executeBatch(); ' ! UF&
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 >h!.Gj
|Z7bd^
事务的处理 t~<-4N$(
1、关闭Connection的自动提交 @'<j!CqQ
o
cn.setAutoCommit(false); 1[gjb((
2、执行一系列sql语句 P{i8
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close l>5]Wd{/
Statement sm ; h-_0 A]
sm = cn.createStatement(insert into user...); [q>i
sm.executeUpdate(); 2$i 0yPv
sm.close(); l LD)i J1
sm = cn.createStatement("insert into corp...); }'.Sn{OWf
sm.executeUpdate(); ^cmP
sm.close(); WH*=81)zp
3、提交 X_s G6Q@
cn.commit(); h&k^l,
4、如果发生异常,那么回滚
DT(Zv2
cn.rollback();