java 数据库基本操作 6onFf* m!x
1、java数据库操作基本流程 jOs&E^">&B
2、几个常用的重要技巧: x:bJ1%
可滚动、更新的记录集 o"F=3b~:n
批量更新 # biI=S
事务处理 2CX'J8Sy
(ly4[G1y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9Xw(|22
1、取得数据库连接 "F/% {0d
1)用DriverManager取数据库连接 7~@q#]U[
例子 w}="}Cb
String className,url,uid,pwd; U8_<?Hd
className = "oracle.jdbc.driver.OracleDriver"; mfHZGk[[
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3DH}
YAUU
uid = "system"; Q[t|+RNKv2
pwd = "manager"; h^E"eC
Class.forName(className); rwb7>]UI"d
Connection cn = DriverManager.getConnection(url,uid,pwd); !Yx9=>R
2)用jndi(java的命名和目录服务)方式 U~krv>I
例子 tHezS~t_
String jndi = "jdbc/db"; M*|,05>
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); X-$~j+YC
DataSource ds = (DataSource) ctx.lookup(jndi); {j%'EJ5
Connection cn = ds.getConnection(); Dh=?Hzw
多用于jsp中 _U%a`%tU.
2、执行sql语句 @1_M's;
1)用Statement来执行sql语句 ~Rx:X4|H
String sql; s!*m^zx
Statement sm = cn.createStatement(); |l)z^V!
sm.executeQuery(sql); // 执行数据查询语句(select) o+e:HjZZ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); &S/@i|_
2)用PreparedStatement来执行sql语句 ?kfLOJQ:I
String sql; v8Ga@*
sql = "insert into user (id,name) values (?,?)"; ,tt]C~\u
PreparedStatement ps = cn.prepareStatement(sql); tOx)t$ix
ps.setInt(1,xxx); V=%j]`Os
ps.setString(2,xxx); n&V \s0
... &)4#0L4
ResultSet rs = ps.executeQuery(); // 查询 E! '|FJ
int c = ps.executeUpdate(); // 更新 p^u;]~JO
&rY73qfP'
3、处理执行结果 K.k%Tg[ ~
查询语句,返回记录集ResultSet 9r,)Bw!RP
更新语句,返回数字,表示该更新影响的记录数 xVOoYr>O
ResultSet的方法 fUy:TCS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false SJ(<u2J]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |X :"AH"S
d~NvS-u7
4、释放连接 @edx]H1~^
cn.close(); k/MrNiC
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 5U[m]W=B
xY]Y
可滚动、更新的记录集 O,m0Xb2s]~
1、创建可滚动、更新的Statement i,5mH$a&u:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); hS<lUG!9UJ
该Statement取得的ResultSet就是可滚动的
Gw4~
2、创建PreparedStatement时指定参数 d\% |!ix
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <Co\?h/<
ResultSet.absolute(9000); )$[.XKoT
批量更新 [I*zZ`
1、Statement ifyWhS++
Statement sm = cn.createStatement(); HE>6A|rgDr
sm.addBatch(sql1); X=Qa TV
sm.addBatch(sql2); aj>6q=R
... sFhmp
sm.executeBatch() i8CO+Iv*{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |Nx7jGd:i
2、PreparedStatement Tf[o'=2
PreparedStatement ps = cn.preparedStatement(sql); 0)=U:y.
{ K"lZwU\:On
ps.setXXX(1,xxx); "UUzLa_
... ;JQ:S~K9
ps.addBatch(); !% ' dyj
} 'Z^-(xG,+
ps.executeBatch(); lOk'stLNa&
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 -?T:> *]p
v/NkG;NWM
事务的处理 > 93I|C|
1、关闭Connection的自动提交 X8l|^[2F
cn.setAutoCommit(false); ;8!L*uMI
2、执行一系列sql语句 (yh zjN~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g9N_s,3jC
Statement sm ; -u!{8S~wA
sm = cn.createStatement(insert into user...); x6-bAf
sm.executeUpdate(); kkA5pbS
sm.close(); }:6$5/?
sm = cn.createStatement("insert into corp...); Pe-1o#7~W
sm.executeUpdate(); >M~wFs$~
sm.close(); QQ1|]/)
3、提交 CF|4, K)
cn.commit(); nQy %av$
4、如果发生异常,那么回滚 )SJ18 no|l
cn.rollback();