java 数据库基本操作 tE-bHu370
1、java数据库操作基本流程 J)Yz@0#T(;
2、几个常用的重要技巧: {wSz >,
可滚动、更新的记录集 .R`_"7
批量更新 /PaS<"<P@
事务处理 aU.3
J3aom,$o
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }KUK|p5
1、取得数据库连接 /V+7:WDj
1)用DriverManager取数据库连接 k}g4?
例子 GL0P&$h
String className,url,uid,pwd; aOinD
className = "oracle.jdbc.driver.OracleDriver"; R$u1\r1I
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; F7C+uGTs
uid = "system"; 4Hf'/%kW
pwd = "manager"; ux^rF
Class.forName(className); 5#f_1
V
Connection cn = DriverManager.getConnection(url,uid,pwd); jt6_1^
2)用jndi(java的命名和目录服务)方式 1
Lg {l
例子 ?Mo)&,__
String jndi = "jdbc/db"; = =pQ
V[
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ZGh6- /
DataSource ds = (DataSource) ctx.lookup(jndi); ;>ml@@Z
Connection cn = ds.getConnection(); b (HJ|
多用于jsp中 %?V~7tHm>
2、执行sql语句 _M8'~$Sg
1)用Statement来执行sql语句 `Zmdlp@
String sql; eW<NDI&b
Statement sm = cn.createStatement(); `j'1V1
sm.executeQuery(sql); // 执行数据查询语句(select) |AExaO"jk
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); k fY;
2)用PreparedStatement来执行sql语句 3jfAv@I ~
String sql; wU'+4N".
sql = "insert into user (id,name) values (?,?)"; 0[YksNNl1
PreparedStatement ps = cn.prepareStatement(sql); +pK 35u
ps.setInt(1,xxx); mBye)q$
ps.setString(2,xxx); //r)dN^
... yZ=O+H
ResultSet rs = ps.executeQuery(); // 查询 \kI{#
int c = ps.executeUpdate(); // 更新 %b_0l<+
6j1C=O@S
3、处理执行结果 _Hx'<%hhI
查询语句,返回记录集ResultSet TEer>gD:v
更新语句,返回数字,表示该更新影响的记录数 G,WLca[
ResultSet的方法 'HV@i)h0%V
1、next(),将游标往后移动一行,如果成功返回true;否则返回false x5g&?2[
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8]#J_|A6Z
H^o_B1
4、释放连接 @>ys,dy
cn.close(); $P8AU81
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Rc9>^>w
1)97AkN(O
可滚动、更新的记录集 pfc"^Gi8
1、创建可滚动、更新的Statement ?)<zzL",
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); op-\|<i
该Statement取得的ResultSet就是可滚动的 _'y`hKeI[
2、创建PreparedStatement时指定参数 ^"iL|3d
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); xp^Jp
ResultSet.absolute(9000); @+Nf@LJ
批量更新 fY=:geB
1、Statement fO#nSB/
8
Statement sm = cn.createStatement(); :!$+dr(d
sm.addBatch(sql1); VS`{k^^
sm.addBatch(sql2); OqH3.@eK
... S1~EJa5H
sm.executeBatch() <f)T*E^5%
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 'Zex/:QS
2、PreparedStatement sc-h O9~k
PreparedStatement ps = cn.preparedStatement(sql); M.qv'zV`xG
{ 1n6%EC|X
ps.setXXX(1,xxx); H;AMRL o4z
... ]d{lS&PRlg
ps.addBatch(); `25<;@
} )3|a_
ps.executeBatch(); p74Nd4U$s
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 |#xBC+
805oV(-
事务的处理 P%R9\iajH
1、关闭Connection的自动提交
(t@!0_5
cn.setAutoCommit(false); N?,
2、执行一系列sql语句 BVus3Y5IJQ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [ gR,nJH.
Statement sm ; eMn'z]M&]
sm = cn.createStatement(insert into user...); PN J&{4wY
sm.executeUpdate(); 64"DT3:
sm.close(); }=gD,]2x8
sm = cn.createStatement("insert into corp...); C(>g4.-p8
sm.executeUpdate(); h'vBWtMa
sm.close(); g&.OJ
3、提交 NTCFmdbs 6
cn.commit(); TZg1,Z
4、如果发生异常,那么回滚 t1yfSStp
cn.rollback();