java 数据库基本操作 @49S`
1、java数据库操作基本流程 &~U ] ~;@
2、几个常用的重要技巧: B@
KQ]4-
可滚动、更新的记录集 %3''}Y5
批量更新 P J[`|
事务处理 R0
K@w{"7}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 0NX,QD
1、取得数据库连接 b9dLt6d
1)用DriverManager取数据库连接 l0i^uMS
例子 delu1r
String className,url,uid,pwd; D*|Bb?
className = "oracle.jdbc.driver.OracleDriver"; ! #2{hQRu
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; xWQ`tWA:J
uid = "system"; .y:U&Rw4
pwd = "manager"; mBON$sF|
Class.forName(className); b<gr@ WF
Connection cn = DriverManager.getConnection(url,uid,pwd); >!)DM]Ri
2)用jndi(java的命名和目录服务)方式 cq4Ipe
例子 2WYPO"q
String jndi = "jdbc/db"; fvxu#m=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :tv,]05t
DataSource ds = (DataSource) ctx.lookup(jndi); C'}KTXiRW
Connection cn = ds.getConnection(); W#3Q ^Z?
多用于jsp中 v^+Sh|z/
2、执行sql语句 "AGLVp.zT
1)用Statement来执行sql语句 WX6&oy>
String sql; L5:$U>H(
Statement sm = cn.createStatement(); Alw3\_X
sm.executeQuery(sql); // 执行数据查询语句(select) %z4Nl$\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
c=.(!qdH
2)用PreparedStatement来执行sql语句 l0A&9g*l2
String sql; QGmn#]w\\
sql = "insert into user (id,name) values (?,?)"; SS.dY""89
PreparedStatement ps = cn.prepareStatement(sql); UFb)AnK
ps.setInt(1,xxx); 0b(N^$js'
ps.setString(2,xxx); K:30_l<
... !f&g-V
ResultSet rs = ps.executeQuery(); // 查询 ;q6Ki.D
int c = ps.executeUpdate(); // 更新 "C0Q(dr/n
b(O3@Q6[
3、处理执行结果 y:qUn!3
查询语句,返回记录集ResultSet 7o5BXF
更新语句,返回数字,表示该更新影响的记录数 V[vl!XM
ResultSet的方法 s#=7IH30
1、next(),将游标往后移动一行,如果成功返回true;否则返回false m5Di=8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 N7R!C)!IL
F6flIG&h
4、释放连接 ;cN{a&
cn.close(); >[=^_8M
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9j:"J` '
C#Iybg
可滚动、更新的记录集 )gy!GK
1、创建可滚动、更新的Statement QbpFE)TYJ|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); X1vd'>
该Statement取得的ResultSet就是可滚动的 M{hg0/}sUW
2、创建PreparedStatement时指定参数 ]1pIj
i[
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3fQuoQuD"}
ResultSet.absolute(9000); Dy8r 9
批量更新 6MdiY1Lr!K
1、Statement 0T5L_%c
Statement sm = cn.createStatement(); UH/\
sm.addBatch(sql1); B%+T2=&$7
sm.addBatch(sql2); IG9VdDj
... ]^K4i)\
sm.executeBatch() >%8KK|V{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 )+t0:GwP`:
2、PreparedStatement =]Jd9]vi
PreparedStatement ps = cn.preparedStatement(sql); _Qi&J.U>
{ *>qp:;,DKP
ps.setXXX(1,xxx); 7,9=uk>0\
... M, mvys$
ps.addBatch(); R/>@+
} PxkOT*
ps.executeBatch(); PQ$%H>{
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 +-CtjhoS
2n"V}p>8i#
事务的处理 N7
$I^?<
1、关闭Connection的自动提交 :^3LvPM
cn.setAutoCommit(false); g0ly
2、执行一系列sql语句 ve2u=eQ1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @xYlS5{
Statement sm ; yT9@!]^L
sm = cn.createStatement(insert into user...); 5>N2:9We
sm.executeUpdate(); 1gN=-AC
sm.close(); !LN?PKJ
sm = cn.createStatement("insert into corp...); ]R9HyCl&a6
sm.executeUpdate(); xw2[d+mB
sm.close(); AvV|(K"
3、提交 6h,(wo3Y
cn.commit(); RMWHN:9
4、如果发生异常,那么回滚 e@*
EzvO
cn.rollback();