java 数据库基本操作 !Y 9V1oVf"
1、java数据库操作基本流程 i,rX.K}X
2、几个常用的重要技巧: `A<2wd;
可滚动、更新的记录集 T(Ji%S>
批量更新 -/:K.SY,
事务处理 QZJnb%]
O*%5P5'p"{
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 izu_1X
1、取得数据库连接 rdsZ[ii
1)用DriverManager取数据库连接 @sUec
例子 v6ei47-
String className,url,uid,pwd; n<1*cL:8B
className = "oracle.jdbc.driver.OracleDriver"; :3{n(~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; F`1J&S;C
uid = "system"; 39L_O RMH
pwd = "manager"; o5:md :\
Class.forName(className); @|{8/sOq
Connection cn = DriverManager.getConnection(url,uid,pwd); S0ltj8t
2)用jndi(java的命名和目录服务)方式 :KqSMuKR
例子 <sSH^J4QqX
String jndi = "jdbc/db";
Tj}%G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); FiSx"o
DataSource ds = (DataSource) ctx.lookup(jndi); &?5me:aU
Connection cn = ds.getConnection(); Mkr
&30il[
多用于jsp中 aq\Fh7
2、执行sql语句 ibLx'<
1)用Statement来执行sql语句 |.;]e[&
String sql; H;0K4|I
Statement sm = cn.createStatement(); DVf}='en8
sm.executeQuery(sql); // 执行数据查询语句(select) 5n1`$T.WG
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); L`(\ud
2)用PreparedStatement来执行sql语句 '
H4m"
String sql; yCuLo`
sql = "insert into user (id,name) values (?,?)"; @d:GtAW
PreparedStatement ps = cn.prepareStatement(sql); Gl"hn
ps.setInt(1,xxx); 9@}5FoX"
ps.setString(2,xxx); P=7X+}@
... ^^< C9
ResultSet rs = ps.executeQuery(); // 查询
yYrFk^
int c = ps.executeUpdate(); // 更新 Y#+Ws0wN
S(/^_Y
3、处理执行结果 +VL:O]`DJ
查询语句,返回记录集ResultSet )l.AsfW%
更新语句,返回数字,表示该更新影响的记录数 ia,5=SKJ
ResultSet的方法 U;0:@.q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false db@^CS[P
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 0O>M/ *W
:4)(Qa(
4、释放连接 n5)ml)m
cn.close(); Ti7
@{7>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection PPh<9$1\g
=R ZPDu
可滚动、更新的记录集 ZXXJ!9-&+J
1、创建可滚动、更新的Statement ]Inu'p\
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ))<vCfuz2
该Statement取得的ResultSet就是可滚动的 S9^SW3
2、创建PreparedStatement时指定参数 3Pp+>{2_?
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Wf-XH|j[
ResultSet.absolute(9000); \.>7w 1p
批量更新 <"}t\pT]
1、Statement iP@FXJJ
Statement sm = cn.createStatement(); ,v`03?8l(
sm.addBatch(sql1); E~VV19Bv]/
sm.addBatch(sql2); mg" _3].j
... p'6XF{
sm.executeBatch() Zrj#4E1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0|C !n+OK
2、PreparedStatement fs-LaV
0
PreparedStatement ps = cn.preparedStatement(sql); tx)$4 v
{ R0mkEM
ps.setXXX(1,xxx); j<`3xd'
... `VvQems
ps.addBatch(); 8(\J~I[^
} FA := )
ps.executeBatch(); 947;6a%$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 vif)g6,
Bsha)<
事务的处理 @/:7G.
1、关闭Connection的自动提交 r^H,H'BohJ
cn.setAutoCommit(false); /^v!B`A@
2、执行一系列sql语句 unKl5A[h
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !\'H{,G
Statement sm ; :{VXDT"
sm = cn.createStatement(insert into user...); TY5R=jh=
sm.executeUpdate(); *e<}hmDr
sm.close(); Uq`6VpZ
sm = cn.createStatement("insert into corp...); _+Sf+ta
sm.executeUpdate(); o^Lq8u;i*
sm.close(); E" >`
3、提交 LbYIRX
cn.commit(); [9V}>kS)
4、如果发生异常,那么回滚 B#+n$5#FK
cn.rollback();