java 数据库基本操作 3jG
#<4;J
1、java数据库操作基本流程 acdWU"<
2、几个常用的重要技巧: [q5N 4&q\
可滚动、更新的记录集 *wOuw@09
批量更新 kk*:S* ,
事务处理 >tFv&1iR
"Nx3_mQ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 QxjX:O
1、取得数据库连接 nR()ei^X
1)用DriverManager取数据库连接 [=xJh?*P
例子 on=I*?+R
String className,url,uid,pwd; QaMB=wVr
className = "oracle.jdbc.driver.OracleDriver"; AHA4{Zu[
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; M zbs#v0
uid = "system"; &D[pX|!
pwd = "manager"; dU4G!
Class.forName(className); k5=VH5{S
Connection cn = DriverManager.getConnection(url,uid,pwd); V;V,G+0Re
2)用jndi(java的命名和目录服务)方式 OSsxO(;g
例子 +uY)MExs2
String jndi = "jdbc/db"; 7 ?O~3
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); az=(6PX
DataSource ds = (DataSource) ctx.lookup(jndi); m@_m"1_;
Connection cn = ds.getConnection(); lv*fK
多用于jsp中 V>2mzc
2、执行sql语句 /#,3JU$w
1)用Statement来执行sql语句 C<?Huw4R0
String sql; O!c b-
Statement sm = cn.createStatement(); Lk-%I?
sm.executeQuery(sql); // 执行数据查询语句(select) clwJ+kku@
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); w|uO)/v
2)用PreparedStatement来执行sql语句 rq.S0bzH
String sql; O73 /2=1V
sql = "insert into user (id,name) values (?,?)"; 3w
B 03\P
PreparedStatement ps = cn.prepareStatement(sql); S24wv2Uw i
ps.setInt(1,xxx); j$K[QSn
ps.setString(2,xxx); -q-/0d<l
... p`i_s(u
ResultSet rs = ps.executeQuery(); // 查询 N {$'-[
int c = ps.executeUpdate(); // 更新 5* d
JvZNr?_w%
3、处理执行结果 JrkjfoN
查询语句,返回记录集ResultSet $m:4'r
更新语句,返回数字,表示该更新影响的记录数 j+_pF<$f:
ResultSet的方法 4&+;n[ D
1、next(),将游标往后移动一行,如果成功返回true;否则返回false B: pIzCP
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2+Tu"oG;rB
0{O|o_
4、释放连接 y<<:6OBj
cn.close(); P2+Z^J`Y>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ]757oAXl
nv9kl Q@
可滚动、更新的记录集 ;BR`}~m
1、创建可滚动、更新的Statement sPee"9%,
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }5)sS}C
该Statement取得的ResultSet就是可滚动的 SgOn:xg;3L
2、创建PreparedStatement时指定参数 o~*5FN}%+l
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 'Si1r%'m#
ResultSet.absolute(9000); :.+?v*%;n
批量更新 aFj)s?$4]K
1、Statement BK_x5mGu3
Statement sm = cn.createStatement(); #jja#PF]7
sm.addBatch(sql1); O-M4NKl]6
sm.addBatch(sql2); \(C_t1
... Uv-xP(X
sm.executeBatch() osJ;"B36
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 r`THOj\cM
2、PreparedStatement JERWz~n}
PreparedStatement ps = cn.preparedStatement(sql); 3']yjj(gHr
{ _Vs\:tygs
ps.setXXX(1,xxx); J:YFy-[w(
... \y-Lt!}
ps.addBatch(); |Ki\Q3O1
} IkU:D"n7
ps.executeBatch(); }wJDHgt]-p
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 SX{6L(
8qEK6-
事务的处理 8G>;X;W
1、关闭Connection的自动提交 mkCv
f
cn.setAutoCommit(false); nr#DE?
2、执行一系列sql语句 kW#{[,7r
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close l"\W] 'T:r
Statement sm ; \gh`PS-B
sm = cn.createStatement(insert into user...); WrR97]7t
sm.executeUpdate(); @+v;B:
sm.close(); }<EA)se"
sm = cn.createStatement("insert into corp...); s^/<6kwO
sm.executeUpdate(); y<G@7?
sm.close(); rsp?N{e
3、提交 2EeWcTBU}.
cn.commit(); QPi]5z?
4、如果发生异常,那么回滚 :(,Eq?
cn.rollback();