java 数据库基本操作 zsJermF,O
1、java数据库操作基本流程 Z6A-i@
2、几个常用的重要技巧: ^|]Dg &N.
可滚动、更新的记录集 q!?*M?Oz
批量更新 2\QsF,@`YU
事务处理 d]"4aS
$2?j2}M
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 G{E`5KIvm
1、取得数据库连接 xZlCFu
1)用DriverManager取数据库连接 ~rJG4U
例子 ,^97Ks
;
String className,url,uid,pwd; \m
GY'0
className = "oracle.jdbc.driver.OracleDriver"; 9|#cjHf
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Z>Mv$F"p:
uid = "system"; _Uq' N0U
pwd = "manager"; VL$
T
Class.forName(className); C5,fX-2Q
Connection cn = DriverManager.getConnection(url,uid,pwd); ,1$F#Eh
2)用jndi(java的命名和目录服务)方式 MA6
Vy
例子 ?!6Itkg
String jndi = "jdbc/db"; @XV&^l-
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ng"=vmu
DataSource ds = (DataSource) ctx.lookup(jndi); "8{A4N1B5
Connection cn = ds.getConnection(); JHt
U"
多用于jsp中 >m,hna]RZ
2、执行sql语句 \`2'W1O
1)用Statement来执行sql语句 ^hmV?a:Y
String sql; D5D *$IC
Statement sm = cn.createStatement(); K+F"V W*?
sm.executeQuery(sql); // 执行数据查询语句(select) yJq< &g
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _>Raw
2)用PreparedStatement来执行sql语句 /[.V( K
D
String sql; MK=oGzK
sql = "insert into user (id,name) values (?,?)";
j)?M
PreparedStatement ps = cn.prepareStatement(sql); %
D
ps.setInt(1,xxx); !m+Pd.4TaB
ps.setString(2,xxx); <$0is:]
... $`E?=L`$
ResultSet rs = ps.executeQuery(); // 查询 3SP";3+
int c = ps.executeUpdate(); // 更新 , ~O>8VbF
xR/CP.dg
3、处理执行结果 1^![8>u"
查询语句,返回记录集ResultSet Zj2 si
更新语句,返回数字,表示该更新影响的记录数 .d]/:T
-0
ResultSet的方法 nn_O"fZi
1、next(),将游标往后移动一行,如果成功返回true;否则返回false E1eGZ&&Gd
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *c$[U{Px
$nO~A7
4、释放连接 d Fy$ w=
cn.close(); Lt't
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection p"ZvA^d\
J:yv82
可滚动、更新的记录集 u}[ a
1、创建可滚动、更新的Statement 5H0qMt P
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); im2mA8OH
该Statement取得的ResultSet就是可滚动的 K ze?@*
2、创建PreparedStatement时指定参数 $[>{s9E
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); s6,~JF^
ResultSet.absolute(9000); *[Z`0AgP
批量更新 h0tiWHw
1、Statement k$3pmy*
Statement sm = cn.createStatement(); 6]brL.eGj
sm.addBatch(sql1); EZ)b E9
sm.addBatch(sql2); &Hb%Q! ^Kb
... \,Y
.5 ?
sm.executeBatch() L|CdTRgRCB
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 }?s-$@$R
2、PreparedStatement 41X`.
PreparedStatement ps = cn.preparedStatement(sql); NnLK!Q
{ 5whW>T
ps.setXXX(1,xxx);
XIInI
... 0;bdwIP3
ps.addBatch(); I%5vI}
} W%L'nR~w$
ps.executeBatch(); 2{79,Js0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g0B] ;Y>(
ip-X r|Bq
事务的处理 N%dY.Fk
1、关闭Connection的自动提交 ;ElCWs->\
cn.setAutoCommit(false); 4z<c8
E8
2、执行一系列sql语句 Bb/if:XS
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6$urrSQ`N0
Statement sm ; ;'S,JGpvT
sm = cn.createStatement(insert into user...); 32ki ?\P
sm.executeUpdate(); mw"FQ?bJ
sm.close(); fd'kv
sm = cn.createStatement("insert into corp...); 5iA>Z!sP[
sm.executeUpdate(); <2pp6je\0s
sm.close(); #]}Ii{1?Y
3、提交 ~B;}jI]d[
cn.commit(); ,Cr%2Wg-
4、如果发生异常,那么回滚 $g>bp<9v4
cn.rollback();