java 数据库基本操作 [IX+M#mf
1、java数据库操作基本流程 .QWhK|(.!
2、几个常用的重要技巧: n~0z_;5
可滚动、更新的记录集 ZXiRw)rM
批量更新 OYwGz
事务处理 /="HqBI#i
(RL>Hn;.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 W.}].7}h
1、取得数据库连接 9t:]
1)用DriverManager取数据库连接 BR_TykP
例子 D#rrW?-z
String className,url,uid,pwd; C*~aSl7
className = "oracle.jdbc.driver.OracleDriver"; HD`>-E#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; F3E[wdT
uid = "system"; j+ ::y) $
pwd = "manager"; M].8HwC +
Class.forName(className); }<m{~32M
Connection cn = DriverManager.getConnection(url,uid,pwd); Pe7e?79
2)用jndi(java的命名和目录服务)方式 ;2`sN
例子 }7/e8 O2
String jndi = "jdbc/db"; UGKaOol.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?bX
DataSource ds = (DataSource) ctx.lookup(jndi); ~5aE2w0K
Connection cn = ds.getConnection(); lJ
多用于jsp中 HOW7cV'X
2、执行sql语句 o
\L!(hm
1)用Statement来执行sql语句 wrv5V M}
String sql; 6vs3O
Statement sm = cn.createStatement(); `aSM8C\
sm.executeQuery(sql); // 执行数据查询语句(select) Y*YFB|f?
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); eD#XDK
2)用PreparedStatement来执行sql语句 [I+9dSM1t
String sql;
'ig, ATY
sql = "insert into user (id,name) values (?,?)"; _9If/RD
PreparedStatement ps = cn.prepareStatement(sql); j'rS&BIG
ps.setInt(1,xxx); 4YA./j%'
ps.setString(2,xxx); ur%$aX)
... y;`eDS'0.N
ResultSet rs = ps.executeQuery(); // 查询 wz(K*FP
int c = ps.executeUpdate(); // 更新 440FhDMj
7nE"F!d+0
3、处理执行结果 Fz"ff4Bx [
查询语句,返回记录集ResultSet f05d ;
更新语句,返回数字,表示该更新影响的记录数 zmFws-+A
ResultSet的方法 :[7lTp
1、next(),将游标往后移动一行,如果成功返回true;否则返回false MiGcA EF;
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 n'w,n1z7
@'jfKW
4、释放连接 5G*II_j
cn.close(); :hqZPajE
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection V0i9DK|!
G?)vWM`j
可滚动、更新的记录集 .Ao0;:;(2-
1、创建可滚动、更新的Statement K b(9)Re
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ';YgG<u
该Statement取得的ResultSet就是可滚动的 D'i6",Z>
2、创建PreparedStatement时指定参数 !$xu(D.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Eu<r$6Q0}o
ResultSet.absolute(9000); {w5Z7s0
批量更新 $[CA&Y.
1、Statement ;)/@Xx
Statement sm = cn.createStatement(); J\`^:tcG
sm.addBatch(sql1); EA0iYzV
sm.addBatch(sql2); fEqC] *s
... KCqqJ}G
sm.executeBatch() x7ATI[b[
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 NPU^)B
2、PreparedStatement S7sb7c'4 k
PreparedStatement ps = cn.preparedStatement(sql); \9m*(_Qf
{ ?Myh7
ps.setXXX(1,xxx); &9 B_/m3
... @)0 Y~A )
ps.addBatch(); uH{'gd,q8
} 5w3Fqu>39?
ps.executeBatch(); 78Y@OL_$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 xy^1US,L1
vOT*iax0
事务的处理 X0i3 _RVa
1、关闭Connection的自动提交 h}Ygb-uZ
cn.setAutoCommit(false); mnQ'X-q3iO
2、执行一系列sql语句 4M`Xrfwm'[
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close `iYc<N`
Statement sm ; :t$A8+A+0
sm = cn.createStatement(insert into user...); ^#SBpLw
sm.executeUpdate(); zy)i1d
sm.close(); _wu*M
sm = cn.createStatement("insert into corp...); P[i\e7mR
sm.executeUpdate(); f_<Y\
sm.close(); |rPAC![=
3、提交 `BT^a
=5
cn.commit(); )U98
4、如果发生异常,那么回滚 aqL<v94wX
cn.rollback();