java 数据库基本操作 q);@iiJ-
1、java数据库操作基本流程 F*p@hl
2、几个常用的重要技巧: s[Whg!2~
可滚动、更新的记录集 :&J1#% t
批量更新 "@UyUL
事务处理 K;*B$2Z#k
5
51p*
B2
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .f9&.H#
1、取得数据库连接 qnJs,"sn
1)用DriverManager取数据库连接 _18Aek
例子 !|~yf3
String className,url,uid,pwd; "Bl6)qw
className = "oracle.jdbc.driver.OracleDriver"; @umn[J#*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; h3j`X'
uid = "system"; YQ`88z
pwd = "manager"; r<!/!}fE,
Class.forName(className); zxC~a97`
Connection cn = DriverManager.getConnection(url,uid,pwd); C&f{LpB`
2)用jndi(java的命名和目录服务)方式 B3W2?5p
例子 51 "v`O+
String jndi = "jdbc/db"; G;AJBs>Y}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ;N^4R$Q.
DataSource ds = (DataSource) ctx.lookup(jndi); .#LvvAeh
Connection cn = ds.getConnection(); g9AA)Ykp
多用于jsp中 B4{F)Zb
2、执行sql语句 `<(o;*&Gd
1)用Statement来执行sql语句 1AQ3<
String sql; s&M#]8x;x
Statement sm = cn.createStatement(); OjsMT]
sm.executeQuery(sql); // 执行数据查询语句(select) <])kO`+G
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); <~
?LU^
2)用PreparedStatement来执行sql语句 4F,RlKHBl
String sql; ^%NjdZu DO
sql = "insert into user (id,name) values (?,?)"; nU/x,W[}
PreparedStatement ps = cn.prepareStatement(sql); rw%OA4>
ps.setInt(1,xxx); LCMn9I
ps.setString(2,xxx); grE'ySX0
... \L"0Pmt[
ResultSet rs = ps.executeQuery(); // 查询 LfMN 'Cb
int c = ps.executeUpdate(); // 更新 x,Z:12H0
zO((FQ
3、处理执行结果 H](TSt<Q"
查询语句,返回记录集ResultSet <G#Q f|&
更新语句,返回数字,表示该更新影响的记录数 ~;@\9oPpz%
ResultSet的方法 i2?TMM!Fe
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $d
Nmq
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }b+$S'`Bv
ggUw4w/e
4、释放连接 dG)}H_
cn.close(); &{S@v9~IT
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection b
q8nV
,"Nb;Yhg
可滚动、更新的记录集 & sgzSX
1、创建可滚动、更新的Statement
QJ,~K&?
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); U]"6KS
该Statement取得的ResultSet就是可滚动的 RY]jY | E
2、创建PreparedStatement时指定参数 qU^`fIa
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ' pfkbmJ
ResultSet.absolute(9000); Q#pgl
批量更新 }@vf=jm>
1、Statement NW~`oc)NS
Statement sm = cn.createStatement(); scyv]5Hm!
sm.addBatch(sql1); !_?#f|
sm.addBatch(sql2); 6t'vzcQs
... !BR@"%hx
sm.executeBatch() &"=<w
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &?^"m\K4J*
2、PreparedStatement LT:8/&\
PreparedStatement ps = cn.preparedStatement(sql); Fr hI[D
{ <AB({(
ps.setXXX(1,xxx); %D>cY!
... aPHNX)
ps.addBatch(); sM@1Qyv&0
} c. uD%
ps.executeBatch(); xd!GRJ<I
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7o9[cq w
m 3Do+!M[
事务的处理 ese?;1r
1、关闭Connection的自动提交 jBJ|%KM
cn.setAutoCommit(false); MZ_dI"J,
2、执行一系列sql语句 d[sY]_ dj
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close k#x"'yZ
Statement sm ; O7yIFqI=/
sm = cn.createStatement(insert into user...); wcL|{rUXba
sm.executeUpdate(); D YTC2
sm.close(); bl[2VM7P
sm = cn.createStatement("insert into corp...); 8i^d*:R
sm.executeUpdate(); .s>.O6(^%
sm.close(); uM2 .?>`X
3、提交 Q$x
3uH\@
cn.commit(); !DXK\,;>
4、如果发生异常,那么回滚 -~]]%VJP|
cn.rollback();