java 数据库基本操作 OBWWcL-
1、java数据库操作基本流程 dVQ[@u1,
2、几个常用的重要技巧: 9|+6@6VY!
可滚动、更新的记录集 ote,`h
批量更新 eTuqK23
事务处理 p-[WpY3
l[}4
X/
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @?3f`l
9
1、取得数据库连接 V_+&Y$msi~
1)用DriverManager取数据库连接 ~ nsb
例子 8+F5n!
String className,url,uid,pwd;
THYw_]K
className = "oracle.jdbc.driver.OracleDriver"; isZ5s\
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; vQMBJ&
uid = "system"; `R[Hxi
pwd = "manager"; }E
'r?N
Class.forName(className); W:]FYC
Connection cn = DriverManager.getConnection(url,uid,pwd); Ww7Ya]b.k
2)用jndi(java的命名和目录服务)方式 3A#Tn7
例子 GShxPH{_j
String jndi = "jdbc/db"; -JMn?]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -pu5O9
@
DataSource ds = (DataSource) ctx.lookup(jndi); Wc3z7xK1@
Connection cn = ds.getConnection(); HK@ij,px
多用于jsp中 @]=40Yj~w
2、执行sql语句 6}4})B2
1)用Statement来执行sql语句 4qQ,1&!]S
String sql; b^1QyX^?:
Statement sm = cn.createStatement(); %M(RV_R+6
sm.executeQuery(sql); // 执行数据查询语句(select) L44m!%q
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); I.<c{4K5
2)用PreparedStatement来执行sql语句 2{OR#v~
String sql; Kgbm/L0XR*
sql = "insert into user (id,name) values (?,?)"; OviS(}v4@
PreparedStatement ps = cn.prepareStatement(sql); )kD/ 8
ps.setInt(1,xxx); AYts
&+
ps.setString(2,xxx); ]{>AU^=U
... 7{;it uqX
ResultSet rs = ps.executeQuery(); // 查询 FwCb$yE#M
int c = ps.executeUpdate(); // 更新 @YJI'Hf67
:D.0\.p
3、处理执行结果 =*mT{q@
查询语句,返回记录集ResultSet }Z!D?(
更新语句,返回数字,表示该更新影响的记录数 '%Ng lC[J
ResultSet的方法 E[H
1、next(),将游标往后移动一行,如果成功返回true;否则返回false V`V\/s gj
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )BP*|URc
k:@DK9
"^
4、释放连接 ;XKe$fsa~?
cn.close(); OmYVJt_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection V2MOD{Maat
)-C3z
可滚动、更新的记录集 0'QWa{dS\
1、创建可滚动、更新的Statement P15
H[<:Fz
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); qL(Q1O!
该Statement取得的ResultSet就是可滚动的 }r:o8+4
2、创建PreparedStatement时指定参数 T<AT&4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ep0,4!#FAO
ResultSet.absolute(9000); !IxO''4
批量更新 S{@}ECla
1、Statement Ha'[uEDb
Statement sm = cn.createStatement(); 7>vm?a^D2&
sm.addBatch(sql1); O7K.\
sm.addBatch(sql2); MmuT~d/
... uV/5f#)
sm.executeBatch() x(_[D08/TT
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 *b~6 B M$
2、PreparedStatement p?@ %/!S
PreparedStatement ps = cn.preparedStatement(sql); @mp`C}x"0&
{
xmW~R*^
ps.setXXX(1,xxx); (\V
i_
... "q@m6fs
ps.addBatch(); [K!9xM6
} Gr"CHz/
ps.executeBatch(); ?1e{\XW
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8[^'PIz
QTV*m>D
事务的处理 cr7MvXF-
1、关闭Connection的自动提交 FL0uY0K
cn.setAutoCommit(false); j0jl$^
2、执行一系列sql语句 C0rf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ']]d-~:
Statement sm ; d:H'[l.F%
sm = cn.createStatement(insert into user...); *{o7G a
sm.executeUpdate(); eim +oms
sm.close(); my=f}%k=
sm = cn.createStatement("insert into corp...); RaZ>.5
D
sm.executeUpdate(); 2ZH+fV?.
sm.close(); Cs,H#L
3、提交 k4TWfl^}9
cn.commit(); D:)Wr, 26
4、如果发生异常,那么回滚 I`>U#x*
cn.rollback();