java 数据库基本操作 yF8 av=<{
1、java数据库操作基本流程 ~k'KS
7c
2、几个常用的重要技巧: Gt3V}"B3\
可滚动、更新的记录集 R'`q0MoN1
批量更新 UR>zL3
事务处理 XXBN
Nr_CK
^$}9
Enj+Y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 6sJN@dFA
1、取得数据库连接 :
9wW*Ix
1)用DriverManager取数据库连接 oi^2Pvauh
例子 Y?a*-"
String className,url,uid,pwd; wC+_S*M-K
className = "oracle.jdbc.driver.OracleDriver"; $6kVhE!;
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; dbQUW#<Q
uid = "system"; BT.;l I
pwd = "manager";
\09eH[
Class.forName(className); jCa%(2~iQ7
Connection cn = DriverManager.getConnection(url,uid,pwd); rXPq'k'h#-
2)用jndi(java的命名和目录服务)方式 w7@fiH{
例子
G?AZ%Yx
String jndi = "jdbc/db"; ze@NqCF
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); aVNBF`
DataSource ds = (DataSource) ctx.lookup(jndi); DK;p6_tT
Connection cn = ds.getConnection(); D~E1hr&Vd>
多用于jsp中 $6e&sDJ
2、执行sql语句 tpOMKh.`
1)用Statement来执行sql语句 O$%M.C'
String sql; $O9Nprf
Statement sm = cn.createStatement(); u.ubw(vv
sm.executeQuery(sql); // 执行数据查询语句(select) AIgJ,=9K
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); bi;?)7p&ZY
2)用PreparedStatement来执行sql语句 ,5$V;|
String sql; {/#^v?,
sql = "insert into user (id,name) values (?,?)"; 9JYrP6I!_
PreparedStatement ps = cn.prepareStatement(sql); ~w_4
nE
ps.setInt(1,xxx); 4wk-f7I(
ps.setString(2,xxx); &MKG#Y}
... 3z';Zwz &X
ResultSet rs = ps.executeQuery(); // 查询 +LuGjDn0
int c = ps.executeUpdate(); // 更新 M0zJGIT~b
ofH=h
3、处理执行结果 PeT _Ty
查询语句,返回记录集ResultSet :iqFC >D
更新语句,返回数字,表示该更新影响的记录数 4=!SG4~o
ResultSet的方法 yr?*{;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false a+sHW<QeS
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3omFd#EP
"uf*?m3
4、释放连接 D!<[\G
cn.close(); S<HR6Xw
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection o=@0Bd8
d$Y3 a^O|
可滚动、更新的记录集 +y'V
1、创建可滚动、更新的Statement ^PA >t$
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); x(pq!+~K
该Statement取得的ResultSet就是可滚动的 c@;$6WSG^
2、创建PreparedStatement时指定参数 ilJeI@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =
}0M^F
ResultSet.absolute(9000); Z^5j.d{e$
批量更新 HxCq6Y_m<
1、Statement feU]a5%XZ
Statement sm = cn.createStatement(); 5mxHOtvtWM
sm.addBatch(sql1); 4gbi?UAmX
sm.addBatch(sql2); z(V?pHv+
... BNns#Q8a
sm.executeBatch() =%P'?(o|
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 GO0Spf_Gh
2、PreparedStatement AT Dm$ *
PreparedStatement ps = cn.preparedStatement(sql); U'(}emh}
{ /)fx(u#
ps.setXXX(1,xxx); DID&fj9m
... swNJ\m
ps.addBatch(); 9DcUx-
} 3yg22y&l
ps.executeBatch(); t9T3e
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <{!^
a Mp*Ap
事务的处理 B^g+_;
1、关闭Connection的自动提交 5(e?,B }
cn.setAutoCommit(false); G%0G$3W"
2、执行一系列sql语句 X{KWBk.1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?g9mDe;k
Statement sm ; E)z[@Np
sm = cn.createStatement(insert into user...); JA0$Fz
sm.executeUpdate(); =qPk'n9i8
sm.close(); Q -;ltJ
sm = cn.createStatement("insert into corp...); ;ELQIHnD"
sm.executeUpdate(); DwM4/m
sm.close(); ZfalB
3、提交 U U!M/QJ
cn.commit(); vQf'lEFk
4、如果发生异常,那么回滚 v\7k
cn.rollback();