java 数据库基本操作 .O1Kwu
1、java数据库操作基本流程 oA;> z
2、几个常用的重要技巧: |_H{B+.
可滚动、更新的记录集 O^_$cq
批量更新 fPj*qi
事务处理 9?6]Zag
W,53|9b@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Wb;x
eG
1、取得数据库连接 < 9 vS
1)用DriverManager取数据库连接 u~-,kF@
例子 6%^9`|3
String className,url,uid,pwd; 50?5xSEM0_
className = "oracle.jdbc.driver.OracleDriver"; Pi!3wy
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; yf/c
uid = "system"; vr$zYdV>
pwd = "manager"; sT;:V
Class.forName(className); !ot$ Q
Connection cn = DriverManager.getConnection(url,uid,pwd); ?%]?#4bkc
2)用jndi(java的命名和目录服务)方式 tw*n+{]hi
例子 Cbq|<p# #o
String jndi = "jdbc/db"; Z4ZR]eD
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _l$1@
DataSource ds = (DataSource) ctx.lookup(jndi); pn._u`xMV
Connection cn = ds.getConnection(); Fb^Ae6/i
多用于jsp中 4Up3x+bg
2、执行sql语句 Aq5@k\[
1)用Statement来执行sql语句 jWX^h^n7K
String sql; :8CYTEc
Statement sm = cn.createStatement(); D$vP&7pOr4
sm.executeQuery(sql); // 执行数据查询语句(select) \U\k$ (
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 7Gs0DwV
2)用PreparedStatement来执行sql语句 ;/-X;!a>
String sql; 1f/8XxTB
sql = "insert into user (id,name) values (?,?)"; KD*q|?Z
PreparedStatement ps = cn.prepareStatement(sql); F,NS:mE
ps.setInt(1,xxx); ss4<s
5:y
ps.setString(2,xxx); flr&+=1?D
... qUuvM
ResultSet rs = ps.executeQuery(); // 查询 %(v<aEQtt
int c = ps.executeUpdate(); // 更新 @9}SHS
!vQDPLBL
3、处理执行结果 4pw:O^v
查询语句,返回记录集ResultSet Rc.8j,]
更新语句,返回数字,表示该更新影响的记录数 x#0B
"{
ResultSet的方法 Q|1X|_hs
1、next(),将游标往后移动一行,如果成功返回true;否则返回false !J%m 7A
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 f|cF[&wo
28jm*Cl8
4、释放连接 GO|EeM!iB
cn.close(); \.AI;^)X@]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2TZ+R7B?
-y1t;yU.L
可滚动、更新的记录集 Z,ZebS@yG
1、创建可滚动、更新的Statement MV,;l94?%=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8>(DQ"h
该Statement取得的ResultSet就是可滚动的 OD~TWT_
2、创建PreparedStatement时指定参数 zm9_[0
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); `
g5S
ResultSet.absolute(9000); mm@)uV<\
批量更新 zr1,A#BV
1、Statement I8]q~Q<-P
Statement sm = cn.createStatement(); P-*=e8z{
sm.addBatch(sql1); Ou'<9m!9
sm.addBatch(sql2); P: 3%#d~q
... ="Edt+a)t
sm.executeBatch() DdG*eKC
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 `J}-U\4F{
2、PreparedStatement w*3DIVlxL
PreparedStatement ps = cn.preparedStatement(sql); cz6\qSh\,
{ VdfV5"
ps.setXXX(1,xxx); pSml+A:
... ap%
Y}
ps.addBatch(); r!,/~~mT
} $>M A
ps.executeBatch(); 3~uWrZ.u
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _hy<11S;
O:>9yZhV
事务的处理 r:n-?P
1、关闭Connection的自动提交 Hswgv$n
cn.setAutoCommit(false); 9"RGf 1]
2、执行一系列sql语句 Jc74A=sT
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?4&C)[^
Statement sm ; 1MF0HiC
sm = cn.createStatement(insert into user...); g12mSbf=9
sm.executeUpdate(); hV6=-QL*B
sm.close(); u3XQ<N{Gj
sm = cn.createStatement("insert into corp...); h+!
sm.executeUpdate(); 1}$GVb%i
sm.close(); wzka4J {
3、提交 V(LE4P1
cn.commit(); /cN. -lEo%
4、如果发生异常,那么回滚 (XDK&]U
cn.rollback();