java 数据库基本操作 MDo4{7
1、java数据库操作基本流程 6}RRrYL7I
2、几个常用的重要技巧: ^uy2qO4Yw
可滚动、更新的记录集 qU1^ K
批量更新 &Vtgh3I
事务处理 oo:(GfO}
d/Z258
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?xTh}Sky
1、取得数据库连接 g7|$JevR0
1)用DriverManager取数据库连接 r:&"#F
例子 77Fpb?0`
String className,url,uid,pwd; ARZ5r48)
className = "oracle.jdbc.driver.OracleDriver"; $|2@of.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "?lm`3W"
uid = "system"; l u^fKQ
pwd = "manager"; 9J$8=UuxWG
Class.forName(className); ^rKA=siz
Connection cn = DriverManager.getConnection(url,uid,pwd); 0> 6;,pd"
2)用jndi(java的命名和目录服务)方式 3gn)q>Xj$
例子 gyI(O>e
String jndi = "jdbc/db"; B3P#p^
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~[mAv#d&i
DataSource ds = (DataSource) ctx.lookup(jndi); &dino
Connection cn = ds.getConnection(); :LuzKCvBP
多用于jsp中 Pw"o[8
2、执行sql语句 O@
GEl
1)用Statement来执行sql语句 ]vPa
A
String sql; Au6*hv3:
Statement sm = cn.createStatement(); n>w/T"
sm.executeQuery(sql); // 执行数据查询语句(select) WG{mg/\2(C
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]J
t8]w
2)用PreparedStatement来执行sql语句 4<['%7U_[
String sql; yvgn}F{}
sql = "insert into user (id,name) values (?,?)"; jQKlJi2xu
PreparedStatement ps = cn.prepareStatement(sql); M#sDPT
ps.setInt(1,xxx); Y{ho[%
ps.setString(2,xxx); ^Fl6-|^~
... \qrSJ=}t
ResultSet rs = ps.executeQuery(); // 查询 R7L:U+*V"
int c = ps.executeUpdate(); // 更新 btfjmR<Tp
ohdWEU,
3、处理执行结果 86^xq#+Uw
查询语句,返回记录集ResultSet fC2
更新语句,返回数字,表示该更新影响的记录数 Qe!Q
$
ResultSet的方法 |vZ\tQ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7I6bZ;}d
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 uF!3a$4]
yW$ja|^E
4、释放连接 pX:FXzYQ
cn.close(); fC_dSM[{c
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection r3@Q(Rb
5ml^3,x
可滚动、更新的记录集 )Tc eNH
1、创建可滚动、更新的Statement .oJs"=h:m
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); cm8-L[>E
该Statement取得的ResultSet就是可滚动的 I$Q%iZ{
2、创建PreparedStatement时指定参数 i4Y_5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); *aXZONym
ResultSet.absolute(9000);
?/_8zpW
批量更新 0,T'z,
1、Statement |EJ&s393&
Statement sm = cn.createStatement(); >@yHa'*9S
sm.addBatch(sql1); 3&D;V;ON}_
sm.addBatch(sql2); &=sVq^d@qe
... s<I[)FQVr
sm.executeBatch() XIu3n9g^#
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 TU&t 1_6
2、PreparedStatement %"Y7 b2pPa
PreparedStatement ps = cn.preparedStatement(sql); qzVmsxBNP
{ w$9aTL7
ps.setXXX(1,xxx); )
0x*>;"o
... #rZk&q
ps.addBatch(); Tr1#=&N0
} fq){?hk~O
ps.executeBatch(); OXC7
m
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 G\\zk
}mjJglK!N
事务的处理 .(Gq9m[~8H
1、关闭Connection的自动提交 o0~+%&
cn.setAutoCommit(false); J~5VL |ca
2、执行一系列sql语句 K_iy^|0)5]
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close gY],
(*v
Statement sm ; B)F2SK<@
sm = cn.createStatement(insert into user...); +w-UK[p
sm.executeUpdate(); v^aARIg
sm.close(); 8c m,G
sm = cn.createStatement("insert into corp...); OCzWP,
sm.executeUpdate(); &(fB+VNrOH
sm.close(); .,:700n+^
3、提交 Mj&f7IUO
cn.commit(); b9[KdVsT6^
4、如果发生异常,那么回滚
0gBD
cn.rollback();