java 数据库基本操作 2LN6pu
1、java数据库操作基本流程 !{+CzUo@
2、几个常用的重要技巧: dz+!yE\f$
可滚动、更新的记录集 (y;
6H
批量更新 `>UUdv{C
事务处理 }I
uqB*g[t
s1wlO y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 P]n0L4c
1、取得数据库连接 m2^vH+wD
1)用DriverManager取数据库连接 mWZP.w^-
例子 eZa7brC|
String className,url,uid,pwd; plPPf+\
className = "oracle.jdbc.driver.OracleDriver"; db,?b>,EE
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; S||W
uid = "system"; Kw"e4 a
pwd = "manager"; xz0t8`NoN
Class.forName(className); KwHN c\\
Connection cn = DriverManager.getConnection(url,uid,pwd);
0<v5_pB
2)用jndi(java的命名和目录服务)方式 "{vWdY|"
例子 vC>2%Zgf-
String jndi = "jdbc/db"; y}oA!<#3
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); %J2Ad
DataSource ds = (DataSource) ctx.lookup(jndi); M`K]g&57hL
Connection cn = ds.getConnection(); ?=4oxPe
多用于jsp中 l4i51S"
2、执行sql语句 YK{J"Kof
1)用Statement来执行sql语句 {.k IC@^O
String sql; ``<#F3
Statement sm = cn.createStatement(); Mj1f;$
sm.executeQuery(sql); // 执行数据查询语句(select) *#>(P
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9d|8c >
I
2)用PreparedStatement来执行sql语句 v`QDms,{
String sql; [;IE Z/ZX
sql = "insert into user (id,name) values (?,?)"; dakHH@Q
PreparedStatement ps = cn.prepareStatement(sql); >}F$6KM
ps.setInt(1,xxx); \Y"S4<"R
ps.setString(2,xxx); m%u`#67oK
... kOo Vqu
ResultSet rs = ps.executeQuery(); // 查询 Wjq9f;
int c = ps.executeUpdate(); // 更新 j[i*;0) |
X7OU=+g
3、处理执行结果 cO{NiRIb
查询语句,返回记录集ResultSet lz>00B<Z
更新语句,返回数字,表示该更新影响的记录数 d+)L K~
ResultSet的方法 $!. [R}
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |sr\SCx
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 yNfj-wM
wN'S+4
4、释放连接 C ibfuR
cn.close(); } 'xGip@W
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection p/_W*0/i
Txo{6nd/
可滚动、更新的记录集 Hk+44
1、创建可滚动、更新的Statement XM!oN^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); :_i1gY)
该Statement取得的ResultSet就是可滚动的 I`XOvSO
2、创建PreparedStatement时指定参数 <<S4l~"o
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Tx&H1
ResultSet.absolute(9000); |0Fo{
批量更新 ha|2u(4
1、Statement !lzj.|7=1
Statement sm = cn.createStatement(); SE(<(w
sm.addBatch(sql1); {BM:c$3@j
sm.addBatch(sql2); n1|]ji[c
... gYbvCs8O!
sm.executeBatch() 3F;0a ;[
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 rMWvW(@@D
2、PreparedStatement 1f^oW[w&
PreparedStatement ps = cn.preparedStatement(sql); 0P$19TN
{ yg}L,JJU<
ps.setXXX(1,xxx);
Rq| 5%;1
... !-qk1+<h
ps.addBatch(); jS3@Z?x?*
} =>Ae]mi7
ps.executeBatch(); zQ<&[Tuwa
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 kKbbsB
P[H`]q|
事务的处理 :,H_
e!
X
1、关闭Connection的自动提交 +>ituJ
cn.setAutoCommit(false); N0lFx?4
2、执行一系列sql语句 H"pYj
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close _`QME r?
Statement sm ; "e\73?P
sm = cn.createStatement(insert into user...); oIE(`l0l
sm.executeUpdate(); $(J)F-DB i
sm.close(); `$ bQ8$+Ci
sm = cn.createStatement("insert into corp...); $aXYtHI
sm.executeUpdate(); $+e(k~
sm.close(); 9|>y[i
3、提交 ')F@em
cn.commit(); G@ybx[_[@
4、如果发生异常,那么回滚 rf$[8d
cn.rollback();