java 数据库基本操作 9$w.9`Py
1、java数据库操作基本流程 0[(8
2、几个常用的重要技巧: M|h3Wt~7
可滚动、更新的记录集 !f[_+CD
批量更新 TIDO@NwF
事务处理 Wn2NMXK
@Nx9)
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 hn@08t G
1、取得数据库连接 U7F!Z(
9
1)用DriverManager取数据库连接 90rol~M&
例子 JH9J5%sp
String className,url,uid,pwd; LH% F8
className = "oracle.jdbc.driver.OracleDriver"; vvMT}-!
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; CAhXQ7w'Z
uid = "system"; Zu[su>\
pwd = "manager"; ~<bZ1TD
Class.forName(className); \M^bD4';>
Connection cn = DriverManager.getConnection(url,uid,pwd); Qw*|qGvy^
2)用jndi(java的命名和目录服务)方式 C&%_a~
例子 {VRf0c
String jndi = "jdbc/db"; CHX #^0m.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Wac&b
DataSource ds = (DataSource) ctx.lookup(jndi); XpHrt XD
Connection cn = ds.getConnection(); va@Lz&sAE%
多用于jsp中 wP@(?z
2、执行sql语句 kTgEd]^&D
1)用Statement来执行sql语句 gwMNYMI
String sql; _G@GpkSe>
Statement sm = cn.createStatement(); ZY+qA
sm.executeQuery(sql); // 执行数据查询语句(select) ;A*]l'[-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); oMa6(3T?E
2)用PreparedStatement来执行sql语句 I\ob7X'Xu!
String sql; lymCH
sql = "insert into user (id,name) values (?,?)"; NXrlk
PreparedStatement ps = cn.prepareStatement(sql); W${Ue#w77
ps.setInt(1,xxx); ^09,"<@k
ps.setString(2,xxx); &h/Xku&0
... :"c*s4
ResultSet rs = ps.executeQuery(); // 查询 TvbE2Q;/UL
int c = ps.executeUpdate(); // 更新 DvvK^+-~
g2_"zDiw2
3、处理执行结果 onzxx4bax
查询语句,返回记录集ResultSet ON(kt3.h
更新语句,返回数字,表示该更新影响的记录数 qX{+oy5
ResultSet的方法 F JyT+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false m{HS0l'
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 UCj ld
n:!_
4、释放连接 `|q(h Ow2
cn.close(); ~]2K^bh8&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 5rik7a)Z]
?e 4/p
可滚动、更新的记录集 5\nAeP
1、创建可滚动、更新的Statement F )eelPZ+,
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 4V`G,W4^J
该Statement取得的ResultSet就是可滚动的 G"t5nHY\.
2、创建PreparedStatement时指定参数 =aW9L)8D
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ^1];S^nD
ResultSet.absolute(9000); G 3ptx!
D
批量更新 @j/a=4o[
1、Statement <LiPEo.R
Statement sm = cn.createStatement(); +M/%+l
sm.addBatch(sql1); @q)d
sm.addBatch(sql2); P&Vv/D
... j8sH|{H!Nq
sm.executeBatch() 8":Q)9;%
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 O=7CMbS3
2、PreparedStatement |sE'XT4ag
PreparedStatement ps = cn.preparedStatement(sql); WpvhTX
{ 3JR+O<3D
ps.setXXX(1,xxx); S
f#
R0SA
... <a3WKw
ps.addBatch(); "w<#^d_6
} R:qW;n%AF
ps.executeBatch(); ZN0P:==
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~P-mC@C
w7L)'9
事务的处理 4Z0]oIX
1、关闭Connection的自动提交 G3T]`Atf
cn.setAutoCommit(false); /)O"l @ }U
2、执行一系列sql语句 ~k5W@`"W
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close JxU5 fe
Statement sm ; Q7CsJzk~)
sm = cn.createStatement(insert into user...); Q"#J6@
sm.executeUpdate(); fk-RV>yr
sm.close(); 4*;MJ[|
sm = cn.createStatement("insert into corp...); K|=A:
sm.executeUpdate(); q)
KKvO
sm.close(); !&E-}}<
3、提交 W(p_.p"
cn.commit(); Ow,b^|
4、如果发生异常,那么回滚 8z\xrY
cn.rollback();