java 数据库基本操作 P9"D[uz
1、java数据库操作基本流程 (4ci=*3=
2、几个常用的重要技巧: CS5jJi"pD3
可滚动、更新的记录集 a^c,=X3
批量更新 N~5WA3xd
事务处理 HwW[M[qA
s.;KVy,=Bu
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 G^rh*cb K
1、取得数据库连接 qH%L"J
1)用DriverManager取数据库连接 5u)^FIBj
例子 N~}v:rK>g
String className,url,uid,pwd; V\K
m% vP
className = "oracle.jdbc.driver.OracleDriver"; ;D"P9b]9$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; s$>m0^
uid = "system"; "gN* J)!x
pwd = "manager"; R%N#G<^R
Class.forName(className); V> a3V'
Connection cn = DriverManager.getConnection(url,uid,pwd); {<}I9D5
2)用jndi(java的命名和目录服务)方式 CDW(qq-zD
例子 EB2^]?
String jndi = "jdbc/db"; 39T&c85
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3TiXYH
DataSource ds = (DataSource) ctx.lookup(jndi); 7
Mki?EG
Connection cn = ds.getConnection(); O&gwr
多用于jsp中 OpbT63@L
2、执行sql语句 TXD^Do5^
1)用Statement来执行sql语句 %*5g<5
String sql; :qCm71*
Statement sm = cn.createStatement(); (2S!$w%
sm.executeQuery(sql); // 执行数据查询语句(select) Gj7QGIKx
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); H]i+o6
2)用PreparedStatement来执行sql语句 Iz?Wtm }
String sql; ^dUfTG9{
sql = "insert into user (id,name) values (?,?)"; t66f 7AR
PreparedStatement ps = cn.prepareStatement(sql); F*4Qa
ps.setInt(1,xxx); F0BOhlK
ps.setString(2,xxx); |T$a+lHMD
... eW"x%|/Q7
ResultSet rs = ps.executeQuery(); // 查询 D;^ZWz0
int c = ps.executeUpdate(); // 更新 )|Vg/S
b*FU*)<4.
3、处理执行结果 SEQO2`]e:
查询语句,返回记录集ResultSet lYZ@a4TA
更新语句,返回数字,表示该更新影响的记录数 GrLM${G
ResultSet的方法 c(Uj'uLc
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *]:G7SW{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 +A'q#~yILa
Jl}!CE@-
4、释放连接 ;H
y!0n
cn.close(); `FYtiv?G
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection }uvKE|umj
XU;{28P
可滚动、更新的记录集 4lY&=_K[)
1、创建可滚动、更新的Statement 0l(E!d8&'
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 2yJ7]+Jd7Y
该Statement取得的ResultSet就是可滚动的 p9&gEW
2、创建PreparedStatement时指定参数 3)C6OF>7
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); nz&b5Xb2
ResultSet.absolute(9000); xyS2_Q
批量更新 8V=HyF#
1、Statement v E3{H
Statement sm = cn.createStatement(); f>s#Ngvc
sm.addBatch(sql1); KMpDlit
sm.addBatch(sql2); ~b>nCP8q
... ;Z!~A"~$>
sm.executeBatch()
'{j\0
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 NWQPOq#
2、PreparedStatement p-T~x$"c|
PreparedStatement ps = cn.preparedStatement(sql); m0BG9~p|
{ de=5=>P7
ps.setXXX(1,xxx); U5On-T5
... g/U$!d_
ps.addBatch(); 9{9#AI.G
} }j5R@I6P
ps.executeBatch(); [.#p
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 f
gK2.;>
{p#l!P/
事务的处理 K)9j
je
1、关闭Connection的自动提交 H#kAm!H
cn.setAutoCommit(false); 8"?Vcw&
2、执行一系列sql语句 SgCqxFii
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close q(ZB.
Statement sm ; /^z/]!JG:V
sm = cn.createStatement(insert into user...); LM"W)S
sm.executeUpdate(); 'FPcAW^8
sm.close(); 45r]wT(C
sm = cn.createStatement("insert into corp...); fXF=F,!t
sm.executeUpdate(); Xa{~a3Wy
sm.close(); fw1;i
3、提交 v|4STR
cn.commit(); nxn[ ~~
4、如果发生异常,那么回滚 i_[
HcgT-
cn.rollback();