java 数据库基本操作 7<&CN0&
1、java数据库操作基本流程 Cg NfqT0
2、几个常用的重要技巧: LO8V*H(
可滚动、更新的记录集 w]w>yD>$
批量更新 Lc;4 Hg
事务处理 mVGQyX
vluA46c
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 XYD}OddO
1、取得数据库连接 )]Xj"V2
1)用DriverManager取数据库连接 V[>MKB(
例子 ;c"T#CH.
String className,url,uid,pwd; eaQ)r?M
className = "oracle.jdbc.driver.OracleDriver"; fk%r?K 6K
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ]Auk5M +
uid = "system"; aaf\% ~
pwd = "manager"; (JS1}T
Class.forName(className); X)iQ){21V
Connection cn = DriverManager.getConnection(url,uid,pwd); mx s=<
2)用jndi(java的命名和目录服务)方式 |eIEqq.Eb
例子 mjUln8Jc
String jndi = "jdbc/db"; `"J=\3->
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); qYj
EQz
DataSource ds = (DataSource) ctx.lookup(jndi); X-Y:)UT
Connection cn = ds.getConnection(); {f]K3V
多用于jsp中 O:'UsI1Y
2、执行sql语句 j`1%a]Bwc
1)用Statement来执行sql语句 kmjSSh/t
String sql; &i*/}OZz
Statement sm = cn.createStatement(); @K`2y'#b
sm.executeQuery(sql); // 执行数据查询语句(select) GD?4/HkF
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9(k5Irv"'h
2)用PreparedStatement来执行sql语句 X
$LX;Lv
String sql; o ohgZ&k2]
sql = "insert into user (id,name) values (?,?)"; - 7)%J+5
PreparedStatement ps = cn.prepareStatement(sql); 'r6s5 WC
ps.setInt(1,xxx); MKSiOM
ps.setString(2,xxx); fvKb0cIx]
... nff&~lwhZ
ResultSet rs = ps.executeQuery(); // 查询 F)KUup)gc
int c = ps.executeUpdate(); // 更新 9u";%5 4
dM"Suw
3、处理执行结果 g+h)s!$sB
查询语句,返回记录集ResultSet D}59fWz@
更新语句,返回数字,表示该更新影响的记录数 U-(2;F)
ResultSet的方法 o*H j E
1、next(),将游标往后移动一行,如果成功返回true;否则返回false VH1PC
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Eh\0gQ=
e,/b&j*4th
4、释放连接 wS"[m>.{v
cn.close(); hmJ{'D1"
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &U:bRzD
:lQl;Q -e
可滚动、更新的记录集 ,w%cX{
1、创建可滚动、更新的Statement %(h-cuhq
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }MAvEaUd
该Statement取得的ResultSet就是可滚动的 a]^hcKo4
2、创建PreparedStatement时指定参数 K@lZuQ.1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); nsWenf
ResultSet.absolute(9000); INZycNqm,
批量更新 JFe %W?}.D
1、Statement wb^Yg9
Statement sm = cn.createStatement(); !\wdX7%
sm.addBatch(sql1); Oz{.>Pjn^o
sm.addBatch(sql2); (6i)m
c(
... 1SoKnfz{6
sm.executeBatch() L<bZVocOb_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Onoi ^MDy
2、PreparedStatement NQzpgf|h
PreparedStatement ps = cn.preparedStatement(sql); v2R41*z,
{ %KL"f
ps.setXXX(1,xxx); y&T(^EA;
... `pS<v.L3
ps.addBatch(); c%-s_8zvi
} y\ L$8BSL
ps.executeBatch(); Nx>WOb98
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 N=hr%{}c
4/;
X-
事务的处理 \ZiZX$
1、关闭Connection的自动提交 `C 'WSr
cn.setAutoCommit(false); 5&]|p'"W\
2、执行一系列sql语句 (CKx
s
I@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 7Yp;B:5@
Statement sm ; ro{q':Z3
sm = cn.createStatement(insert into user...); Z(LDAZG
sm.executeUpdate(); VP^Yph 8R
sm.close(); "4N%I
sm = cn.createStatement("insert into corp...); .),%S}
sm.executeUpdate(); EIO!f[]o
sm.close(); J~7E8
3、提交 v%c r
cn.commit(); b'Cy!d r
4、如果发生异常,那么回滚 |/K+tH
cn.rollback();