java 数据库基本操作 >/$Fh:R-
1、java数据库操作基本流程 /# NYi,<{X
2、几个常用的重要技巧: W!Gdf^Yy<
可滚动、更新的记录集 (.Y/
批量更新 rh*sbZ68>E
事务处理 y[};J
vk
K>:]Bx#F7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 k;W@LfP
1、取得数据库连接 OHrY(I6
1)用DriverManager取数据库连接 x3+oAb@o/
例子 I?#85l{>
String className,url,uid,pwd; 9p* gU[
className = "oracle.jdbc.driver.OracleDriver"; YIhm$A"z0"
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +EXJ\wy
uid = "system"; Y*oDO$6
pwd = "manager"; #SVNHpx
Class.forName(className); [(kB
5 a
Connection cn = DriverManager.getConnection(url,uid,pwd); yM.IxpT#$
2)用jndi(java的命名和目录服务)方式 ZFm`UXS
例子 K kW;-{c
String jndi = "jdbc/db"; -7H^n#]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); G.VuKsP]
DataSource ds = (DataSource) ctx.lookup(jndi); f_ ^1J
Connection cn = ds.getConnection(); z+}QZ>
多用于jsp中 ~+X9g
2、执行sql语句 B<?[Mrdxw
1)用Statement来执行sql语句 DB526O*
[
String sql; wBj-m
Statement sm = cn.createStatement(); 2|iV,uJ&
sm.executeQuery(sql); // 执行数据查询语句(select) \2-@' ^i
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Yj|eji7y
2)用PreparedStatement来执行sql语句 Vgb *% I
String sql; inb^$v
sql = "insert into user (id,name) values (?,?)"; 9I7\D8r
PreparedStatement ps = cn.prepareStatement(sql); }GMbBZ:nKK
ps.setInt(1,xxx); e1myH6$W
ps.setString(2,xxx); %VJ85^B3
... lf<S_2i
ResultSet rs = ps.executeQuery(); // 查询 asiov[o;
int c = ps.executeUpdate(); // 更新 6d[_G$'nk
gU^$Sx7'
3、处理执行结果 @:0ddb71
查询语句,返回记录集ResultSet @!N-RQ&A
更新语句,返回数字,表示该更新影响的记录数 _ZB\L^j)
ResultSet的方法 2aZw[7s
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %_-zWVJ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9h90huyKF
-ezY= 0Q&
4、释放连接 B5V_e!*5F*
cn.close(); WF&[HKOy/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ^efb
5
thi1kJ`L
可滚动、更新的记录集 _mvxsG
1、创建可滚动、更新的Statement b+-f.!j
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 54;J8XT7
该Statement取得的ResultSet就是可滚动的 WL,&-*JAW
2、创建PreparedStatement时指定参数 V3;.{0k
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #ge)2
ResultSet.absolute(9000); \@3Qi8u//
批量更新 9Ya<My
1、Statement 1 2++RkL#
Statement sm = cn.createStatement(); %D$,;{ew
sm.addBatch(sql1); V-I(WzR9y
sm.addBatch(sql2); XfE?C:v
... 1be %G [*
sm.executeBatch() {CG_P,FO
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3nZ9m
2、PreparedStatement jCAC
`
PreparedStatement ps = cn.preparedStatement(sql); AsS$C&^
{ r)9Dy,
ps.setXXX(1,xxx); f %lD08Sl
... S d/?&
ps.addBatch(); EpS(o>'
} @ l1
ps.executeBatch(); +x?#DH-
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 $8USyGi3J
aV o;~h~
事务的处理 *%w69#D
1、关闭Connection的自动提交 U t-B^x)gl
cn.setAutoCommit(false); U-k+9f 0
2、执行一系列sql语句 UX3BeUi.)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;@,Q&B2eM
Statement sm ; 07Gv* .
sm = cn.createStatement(insert into user...); 93+"D`
sm.executeUpdate(); h)1qp Qj
sm.close(); c^rOImZ
sm = cn.createStatement("insert into corp...); 9=w|)p )
sm.executeUpdate(); +uWDP.
sm.close(); RCTQhTy=
3、提交 v%k9M{
cn.commit(); N"/-0(9[
4、如果发生异常,那么回滚 8zLY6@
cn.rollback();