java 数据库基本操作 nc|p )
1、java数据库操作基本流程 81
sG
2、几个常用的重要技巧: fS78>*K
可滚动、更新的记录集 ._{H~R|
批量更新 o:Sa,
!DK
事务处理 JrRH\+4K
_>X+ZlpU:
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 bB3powy9
1、取得数据库连接 y/ef>ZZ
1)用DriverManager取数据库连接 E#N|wq
例子 *wB1,U{
String className,url,uid,pwd; GDiBl* D
className = "oracle.jdbc.driver.OracleDriver"; 1NA.nw.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; X?qK0fS
uid = "system"; VQ9/Gxdeo
pwd = "manager"; &Ys<@M7E:
Class.forName(className); CN8Y\<Ar
Connection cn = DriverManager.getConnection(url,uid,pwd); fHd#u%63K
2)用jndi(java的命名和目录服务)方式 %2V? ,zY@
例子 |imM#wF
String jndi = "jdbc/db"; KF!Yf\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); pYmk1!]/
DataSource ds = (DataSource) ctx.lookup(jndi); R|87%&6']
Connection cn = ds.getConnection(); a'yK~;+_9
多用于jsp中 @>Km_Ax
2、执行sql语句 Sw,+p
1)用Statement来执行sql语句 5(Q%XQV*P
String sql; #( 146
Statement sm = cn.createStatement(); kzUIZ/+ZL,
sm.executeQuery(sql); // 执行数据查询语句(select) XrGglBIV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); y(yHt=r
2)用PreparedStatement来执行sql语句 scz&h#0V
String sql; rlSeu5X6
sql = "insert into user (id,name) values (?,?)"; L2i_X@/
PreparedStatement ps = cn.prepareStatement(sql); 4*cEag
ps.setInt(1,xxx); 6HWE~`ok6
ps.setString(2,xxx); ytJ/g/,A0i
... YWO)HsjP
ResultSet rs = ps.executeQuery(); // 查询 u.m[u)HQ
int c = ps.executeUpdate(); // 更新 +.b,AqJ/
aP@N)"
3、处理执行结果 >rmqBDKaQ
查询语句,返回记录集ResultSet 9ZsVy
更新语句,返回数字,表示该更新影响的记录数 0#Y5_i|p
ResultSet的方法 &d?CCb$|0Y
1、next(),将游标往后移动一行,如果成功返回true;否则返回false \aUC(K~o\;
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 _FU_Ubkr
|a`Sc%
4、释放连接 umH40rX+
cn.close();
goOCu
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ;rGwc$?|
Q%f^)HZGR
可滚动、更新的记录集 S3*`jF>q
1、创建可滚动、更新的Statement s.QwSbw-g
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); B:S>wFE(.
该Statement取得的ResultSet就是可滚动的 n&qg;TT
2、创建PreparedStatement时指定参数 s %``H`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); CMG&7(MR
ResultSet.absolute(9000); *:LK8U
批量更新 li'YDtMKCY
1、Statement J~zUp(>K
Statement sm = cn.createStatement(); ;oKZ!ND
sm.addBatch(sql1); g._]8{K
sm.addBatch(sql2);
03qQ'pq
... bL+_j}{:N
sm.executeBatch() N06OvU2>xU
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 r,1!?s^L
2、PreparedStatement +-U- D?-
PreparedStatement ps = cn.preparedStatement(sql); $m{:C;UH
{ ~IfJwBn-i
ps.setXXX(1,xxx); z2_*%S@
... *ebSq)
ps.addBatch(); JHM9
} F^t DL:
ps.executeBatch(); 2~1SQ.Q<RY
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gx8ouOh
sV{,S>s
事务的处理 ,j2Udn}
1、关闭Connection的自动提交 Yz/md1T$
cn.setAutoCommit(false); %S@ZXf~:
2、执行一系列sql语句 Jr
,;>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close D9CaFu
Statement sm ; p$NQyS5C"S
sm = cn.createStatement(insert into user...); mPtZO*Fc
sm.executeUpdate(); z0p*Z&
sm.close(); Utj&]RELK
sm = cn.createStatement("insert into corp...); 6S'yZQ|b
sm.executeUpdate(); I {S;L
sm.close(); ~q@|l3?$
3、提交 7a=gH2]&
cn.commit(); \:# L)
4、如果发生异常,那么回滚 nA-.mWD_C
cn.rollback();