java 数据库基本操作 %`Re{%1;
1、java数据库操作基本流程 S{@}ECla
2、几个常用的重要技巧: 9"[;ld <
可滚动、更新的记录集 @-N` W9
批量更新 jlEz]@
i
事务处理 @mp`C}x"0&
B/?
L$m
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 bOS)vt*V
1、取得数据库连接 okNo-\Dh!
1)用DriverManager取数据库连接 [6/QUD8
例子 QTV*m>D
String className,url,uid,pwd; { _rfhz
className = "oracle.jdbc.driver.OracleDriver"; y_]+;% w:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =OVDJ0ozZ
uid = "system"; q'2vE;z Kb
pwd = "manager"; !40>LpL[
Class.forName(className); ~/
%Xm<
Connection cn = DriverManager.getConnection(url,uid,pwd); YO6BzS/~
2)用jndi(java的命名和目录服务)方式 \bA Yic
例子 !3v&+Jrf6
String jndi = "jdbc/db"; 6_LeP9s )
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Cs,H#L
DataSource ds = (DataSource) ctx.lookup(jndi); 2iAC_"n
Connection cn = ds.getConnection(); I`>U#x*
多用于jsp中 5=dL`
2、执行sql语句 &/@V$'G=
1)用Statement来执行sql语句 CmEqo;Is
String sql; |Xt G9A>
Statement sm = cn.createStatement(); \JLGw1F
sm.executeQuery(sql); // 执行数据查询语句(select) YQ0#j'}/
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); y
oW~
2)用PreparedStatement来执行sql语句 fit{n]g
String sql; dsTX?E<R
sql = "insert into user (id,name) values (?,?)"; 4o>y9
PreparedStatement ps = cn.prepareStatement(sql); -CPtYG[s
ps.setInt(1,xxx); :saP
:&
ps.setString(2,xxx);
cILS
... {f06Ki
ResultSet rs = ps.executeQuery(); // 查询 -()WTdIy
int c = ps.executeUpdate(); // 更新 (/y8KG3
PD#,KqL:
3、处理执行结果 ~yv7[`+Tgg
查询语句,返回记录集ResultSet !GOaBs
更新语句,返回数字,表示该更新影响的记录数 Emlj,c<?j
ResultSet的方法 %=**cvVy
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Dka,v
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 sXVl4!=l6
xHgC':l(0
4、释放连接 9r%fBiSk
cn.close(); 161P%sGx2
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection }:8}i;#M
#GM^ :rF
可滚动、更新的记录集 ?(ORk|)kU
1、创建可滚动、更新的Statement ^'QO!{7f
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <83Ky;ry
该Statement取得的ResultSet就是可滚动的 eV7;#w<]
2、创建PreparedStatement时指定参数 A6(Do]M
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 0ix(1`Z
ResultSet.absolute(9000); p)biOG
批量更新 L0w6K0J4
1、Statement i{$-[*WHiV
Statement sm = cn.createStatement(); 0CzQel)L:
sm.addBatch(sql1); 3.W[]zH/u
sm.addBatch(sql2); 77\+V 0cF
... 0zW*JJxV
sm.executeBatch() <]Td7-n
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 .7Mf(1:
2、PreparedStatement =.`\V]
PreparedStatement ps = cn.preparedStatement(sql); Pe`mZCd^
{ 8LV6E5Q
ps.setXXX(1,xxx); @$
7 GrT
... bPVk5G*ruP
ps.addBatch(); zPnb_[YF
} 8AR8u!;8
ps.executeBatch(); _[rFnyC+0V
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 $RDlM
"B'c;0@q
事务的处理 &S4*x|-C&
1、关闭Connection的自动提交 AJyNlQ
cn.setAutoCommit(false); XFWpHe_ L
2、执行一系列sql语句 B*tYp
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close tz;3
Statement sm ; |_?e.}K
sm = cn.createStatement(insert into user...); C0N
:z.)4
sm.executeUpdate(); puPI^6y%
sm.close(); jG>W+lq
sm = cn.createStatement("insert into corp...); O9daeIF0#
sm.executeUpdate(); s)Y1%#
sm.close(); um%_kX
3、提交 5W)ST&YPL*
cn.commit(); y#Dh)~|k
4、如果发生异常,那么回滚 N3"Jo uP
cn.rollback();