java 数据库基本操作 G`K7P`m
1、java数据库操作基本流程 (
I~XwP&
2、几个常用的重要技巧: obkv ]~
可滚动、更新的记录集 a'.=.eDQ
批量更新 T>?1+mruM
事务处理 u"3cSuqy
lw lW.C
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :7]R2JP
1、取得数据库连接 BU .G~0
1)用DriverManager取数据库连接 mI18A#[ 3
例子 43fA;Uc{Y`
String className,url,uid,pwd; CbQ%[x9|
className = "oracle.jdbc.driver.OracleDriver"; @5ybBh]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <>GyG-q
uid = "system";
p5hP}Z4r
pwd = "manager"; 60$
Class.forName(className); y%AJ>@/;
Connection cn = DriverManager.getConnection(url,uid,pwd); \FM- FQK
2)用jndi(java的命名和目录服务)方式 1+#8} z:
例子 yLX\pkAt4
String jndi = "jdbc/db"; |0
VP^md
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); {,X(fJ
DataSource ds = (DataSource) ctx.lookup(jndi); sa?;D
Connection cn = ds.getConnection(); %stktVDAP
多用于jsp中 wm4e:&
2、执行sql语句 .YlM'E*X
1)用Statement来执行sql语句 K ajyQ"j
String sql; U9s y]7
Statement sm = cn.createStatement(); Y`v&YcX;
sm.executeQuery(sql); // 执行数据查询语句(select) 3ly|y{M",
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); fQdQ[
2)用PreparedStatement来执行sql语句 pe8MG(V
String sql; TaH9Nu
sql = "insert into user (id,name) values (?,?)"; bVym
PreparedStatement ps = cn.prepareStatement(sql); ;nbvn
ps.setInt(1,xxx); L`BLkDm
ps.setString(2,xxx); 6IA~bkc}
... `B~%TEvMh
ResultSet rs = ps.executeQuery(); // 查询 e BPMT
int c = ps.executeUpdate(); // 更新 "A7tb39*
A'T! og|5
3、处理执行结果 <\u%ZB
查询语句,返回记录集ResultSet QQcJUOxT9
更新语句,返回数字,表示该更新影响的记录数 wSGUNP9
ResultSet的方法 Zx6BK=4G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false B(hNBq7
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .+.Pc_fv
Im2g2]
4、释放连接 i*3'O:Gq
cn.close(); a[!':-R`s
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection /$E1!9J
g"xZ{k_3
可滚动、更新的记录集 ev`p!p
1、创建可滚动、更新的Statement Y (Q8P{@(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); YAD9'h]d\
该Statement取得的ResultSet就是可滚动的 3JwmLGj}
2、创建PreparedStatement时指定参数 mT;z `*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :gmVX}
ResultSet.absolute(9000); y9 "!ys
批量更新 zPn8>J<.0Q
1、Statement zT@vji%Y
Statement sm = cn.createStatement(); mYZH]oo
sm.addBatch(sql1); U<t Qj`
sm.addBatch(sql2); 0>vm&W<?)
... ke0Vy(3t{h
sm.executeBatch() zK}.Bhj#
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 -7CkOZT
2、PreparedStatement -<.>jX
PreparedStatement ps = cn.preparedStatement(sql); x~
I cSt
{ RSy1 wp4W
ps.setXXX(1,xxx); 1'h?qv^(
... `eA 0Z:`g!
ps.addBatch(); ) E5ax~
} &}WSfZ0{
ps.executeBatch(); gxF3gM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 'n\ZmG{
l ^{]pD
事务的处理 u
VB&DE
1、关闭Connection的自动提交 |b|p0Z%7{
cn.setAutoCommit(false); Q-AN~k8+)[
2、执行一系列sql语句 A\:M}D-(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close K-K+%U
Statement sm ; %k"-rmW
sm = cn.createStatement(insert into user...); 6_XTeu
sm.executeUpdate(); QJxcH$
sm.close(); ~*&_zPTN
sm = cn.createStatement("insert into corp...); :wMZ&xERDZ
sm.executeUpdate(); Upf1*$p
sm.close(); l-5-Tf&j
3、提交 3=`UX
cn.commit(); K}6}Opr,Tt
4、如果发生异常,那么回滚 _uDtRoI8
cn.rollback();