java 数据库基本操作 ]+G\1SN~
1、java数据库操作基本流程 VP< zOk7
2、几个常用的重要技巧: ();Z,A
可滚动、更新的记录集 J4]"@0 ?6
批量更新 Hd4 ~v0eS
事务处理 iM!V4Wih6
7r,GdP .
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 V@+sNM
1、取得数据库连接 jA8Bmwt;w
1)用DriverManager取数据库连接 H`<u2fo|p
例子 1<h@^s ;
String className,url,uid,pwd; /7B3z}rd
className = "oracle.jdbc.driver.OracleDriver"; 2G|}ENC
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3B[tbU(
uid = "system"; dDiy_Q6
pwd = "manager"; &pl)E$Y
Class.forName(className); <.g)?nj1
Connection cn = DriverManager.getConnection(url,uid,pwd); <Y /3U
2)用jndi(java的命名和目录服务)方式 DaH4 Br.2
例子 :M;|0w*b
String jndi = "jdbc/db"; MuO(%.H
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); j^/<:e c.
DataSource ds = (DataSource) ctx.lookup(jndi); >WO;q
Connection cn = ds.getConnection(); y-@`3hYM@
多用于jsp中 }#Up:o]A!
2、执行sql语句 n{|j#j
1)用Statement来执行sql语句 yo5-x"ze
String sql; /p;OZf]
Statement sm = cn.createStatement(); rG-x 3>b
sm.executeQuery(sql); // 执行数据查询语句(select) bPV}T`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); e8SAjl"}
2)用PreparedStatement来执行sql语句 Q$Qr)mcC
String sql; DFfh!KKR$
sql = "insert into user (id,name) values (?,?)"; Dt5AG
PreparedStatement ps = cn.prepareStatement(sql); %eF=;q
ps.setInt(1,xxx); k FRVW+
ps.setString(2,xxx); ci%$So2#
... pb<eg,
ResultSet rs = ps.executeQuery(); // 查询 Q_/UC#I8
int c = ps.executeUpdate(); // 更新 Oc~<`C~
uj}%S_9
3、处理执行结果 y2g)*T!m
查询语句,返回记录集ResultSet z+fy&NPl
更新语句,返回数字,表示该更新影响的记录数 \xOYa
ResultSet的方法 4EeVO5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *W=1yPP
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Qt"jU+Zoy
ko!]vHB9`
4、释放连接 E08!a
cn.close(); r
'ioH"=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection }K.)yv n
P2>_qyX
可滚动、更新的记录集 cgcU2N6y;
1、创建可滚动、更新的Statement 9~ V(wG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); (CAVOed
该Statement取得的ResultSet就是可滚动的 }q_Iep
2、创建PreparedStatement时指定参数 G"J
8i|~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <YG 42,N
ResultSet.absolute(9000); 6 X2w)cO
批量更新 SP=8v0
1、Statement , Sf:R4=
Statement sm = cn.createStatement(); 4M$"0}O;[h
sm.addBatch(sql1); ^~B#r#
sm.addBatch(sql2); WYvcN8F
... L.9@rwfI
sm.executeBatch() \Vj7%ph
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 nKwOSGPQt
2、PreparedStatement _B&;z $
PreparedStatement ps = cn.preparedStatement(sql); YqKQm+G
{ *wdNZ
ps.setXXX(1,xxx); EwfL.z
... w$qdV,s 7
ps.addBatch(); J"eE9FLM
} RXO}mu]Iu
ps.executeBatch(); NljcHe}Qy
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !{r@ H+Kf
'cN3Vv k
事务的处理 Rs]Y/9F;{
1、关闭Connection的自动提交 1b7 Q-elG
cn.setAutoCommit(false); 06af{FXsGb
2、执行一系列sql语句 lA,[&
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close O2Y1D`&5
Statement sm ; xs)SKG*
sm = cn.createStatement(insert into user...); Y>i
Qp/k:
sm.executeUpdate(); 1OFrxSg
sm.close(); z4[8*}
sm = cn.createStatement("insert into corp...); -<\hcV`&
sm.executeUpdate(); K?S5C8
sm.close(); /u'V>=D;f
3、提交 6
#jpA.;
cn.commit(); cW{ Bsr
4、如果发生异常,那么回滚 sVS),9\}
cn.rollback();