java 数据库基本操作 I+{2DY/}
1、java数据库操作基本流程 XCyU)[wY
2、几个常用的重要技巧: d/Sw.=vq
可滚动、更新的记录集 @WCA7DW!
批量更新 }]i.z:7+
事务处理 Q}9!aB,
|:w)$i& *
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 I>EEUQR/$H
1、取得数据库连接 ^UCH+Cyl
1)用DriverManager取数据库连接 oGRd ;hsF
例子 6gs0Vm
String className,url,uid,pwd; S4U}u l
className = "oracle.jdbc.driver.OracleDriver"; [H[L};%=j
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; KAJR.YNm
uid = "system"; 5) q_Aro
pwd = "manager"; Xp+lpVcJ
Class.forName(className); r;^%D(
Connection cn = DriverManager.getConnection(url,uid,pwd); j7BLMTF3v
2)用jndi(java的命名和目录服务)方式 r2*8.j51
例子 \,xa_zeO
String jndi = "jdbc/db"; H+{@VB
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uH&B=w
DataSource ds = (DataSource) ctx.lookup(jndi); t6uYFxE
Connection cn = ds.getConnection(); b>2{F6F
多用于jsp中 ZkJLq[:cM
2、执行sql语句 VqUCcT
1)用Statement来执行sql语句 PI.Zd1r
String sql; QWc,JCu
Statement sm = cn.createStatement(); xa'^:H $X
sm.executeQuery(sql); // 执行数据查询语句(select) $cWt^B'
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ck< `kJ`b
2)用PreparedStatement来执行sql语句 ~t<G gNI
String sql; !bCSt?}@u
sql = "insert into user (id,name) values (?,?)"; 8y']kVg
PreparedStatement ps = cn.prepareStatement(sql); -UM|u_
ps.setInt(1,xxx); c@2a)S8Y]
ps.setString(2,xxx); G@KDRv
... TSD7R
ResultSet rs = ps.executeQuery(); // 查询 8@[S,[
int c = ps.executeUpdate(); // 更新 )@ofczl6
jddhX]>I
3、处理执行结果 q3vv^~
查询语句,返回记录集ResultSet G6.lRaPu"m
更新语句,返回数字,表示该更新影响的记录数 ?b:Pl{?
ResultSet的方法 +T&YYO8>5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Pr:\zI
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 @eM$S5&n$
zO2=o5nF.
4、释放连接 %JHv2[r^P
cn.close(); @j!(at4B
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
4fIjVx
^TD%l8o6
可滚动、更新的记录集 )m#Y^
1、创建可滚动、更新的Statement ,k_"T.w
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); q_6fr$-Qh
该Statement取得的ResultSet就是可滚动的 H$ %F0'0
2、创建PreparedStatement时指定参数 &09&;KJ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?nPG#Z|%
ResultSet.absolute(9000); h
w^
V
批量更新 wH$qj'G4CN
1、Statement
wz)s
Statement sm = cn.createStatement(); _Vl~'+ e
sm.addBatch(sql1); x`c7*q%
sm.addBatch(sql2); 1tq ^W'
... eR,/}g\
sm.executeBatch() c4u/tt.)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P-a8S*RRa
2、PreparedStatement \WBO(,]V
PreparedStatement ps = cn.preparedStatement(sql); Y=4
7se=h"
{ tz8fZ*n
ps.setXXX(1,xxx); 8k3y"239t
... Wsgp#W+
ps.addBatch(); qw$9i.Z
} <S=(`D
ps.executeBatch(); MhR`
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 RcO"k3J
tfe]=_U
事务的处理 0%Le*C'yk
1、关闭Connection的自动提交 c~4Cpy^
cn.setAutoCommit(false); ZY8w1:'
2、执行一系列sql语句 tkH]_cH'w
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g^Hf^%3xP
Statement sm ; qTK(sW
sm = cn.createStatement(insert into user...); %W8iC%~
sm.executeUpdate(); o">~ObR
sm.close(); M(nzJ
sm = cn.createStatement("insert into corp...);
?HRS*
sm.executeUpdate(); "-djA, `
sm.close(); (6B;
3、提交 %.hJDX\j
cn.commit(); up+0-!AH
4、如果发生异常,那么回滚 dOKp:|9G
cn.rollback();