java 数据库基本操作 8`L#1ybMO
1、java数据库操作基本流程 QN{}R;s
2、几个常用的重要技巧: rX|y/0)F
可滚动、更新的记录集 Q1O_CC}
批量更新 2uJNc!&
事务处理 E<X{72fb>
RTg Q#<W8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 = )JVT$]w
1、取得数据库连接 d- Z+fz
1)用DriverManager取数据库连接 Rye~w6
例子 }[=xe(4]D
String className,url,uid,pwd; I =tyQ`
className = "oracle.jdbc.driver.OracleDriver"; 4~MJ4:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Zq\RNZ}
uid = "system"; Yj^avO=;
pwd = "manager"; 1sIy*z
Class.forName(className); QK``tWLIg7
Connection cn = DriverManager.getConnection(url,uid,pwd); &;~2sEo,
2)用jndi(java的命名和目录服务)方式
X]&;8
例子 LK
String jndi = "jdbc/db"; ei+9G,
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); !]{1h
DataSource ds = (DataSource) ctx.lookup(jndi); #f|NM7
Connection cn = ds.getConnection(); 'XZI{q2i
多用于jsp中 A-Q{*{^#
2、执行sql语句 h X>VVeIZ
1)用Statement来执行sql语句 ${E[pT
String sql; 6oTbn{=UUq
Statement sm = cn.createStatement(); %h/#^esi
sm.executeQuery(sql); // 执行数据查询语句(select) ^\7 x5gO
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); k *G!.
2)用PreparedStatement来执行sql语句 ]2aYi9)
String sql; ZuFVtW@
sql = "insert into user (id,name) values (?,?)"; g "K#&
PreparedStatement ps = cn.prepareStatement(sql); #Vn>ue+?
ps.setInt(1,xxx); azR;*j8Q'
ps.setString(2,xxx); QKUBh-QFK
... uK4'n+_>\
ResultSet rs = ps.executeQuery(); // 查询 JA SR
int c = ps.executeUpdate(); // 更新 ABq {<2iYN
aUIc=Z
3、处理执行结果 #TW>'lF
查询语句,返回记录集ResultSet <y\
Z#z
更新语句,返回数字,表示该更新影响的记录数 Y?&DEKFbD
ResultSet的方法 +s/N@]5nW
1、next(),将游标往后移动一行,如果成功返回true;否则返回false sw=JUfAhy
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
s>*Q
]@ Sc}
4、释放连接 Bah.\ZsYQP
cn.close(); f'zU^/$rf
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection xtIehr0{$I
8XH |T^5
可滚动、更新的记录集 Zy!)8<Cgm'
1、创建可滚动、更新的Statement tz0Ttu=xH
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); n ]6
0
该Statement取得的ResultSet就是可滚动的 aCYm$6LmA
2、创建PreparedStatement时指定参数 w
~L\Ebg
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); JK:mQ_
ResultSet.absolute(9000); >XXMIz:
批量更新 qj3bt_F!x
1、Statement lEYT{
Statement sm = cn.createStatement(); ~J. Fl[
sm.addBatch(sql1); VkN[=0a,
sm.addBatch(sql2); <*r<+S
... }n2-*{)x
sm.executeBatch() aaqd:N)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 O{i_?V_
2、PreparedStatement QGbD=c7
PreparedStatement ps = cn.preparedStatement(sql); {xBjEhQm
{ Z$#ZYD
ps.setXXX(1,xxx); g+KzlS[6
... m`yn9(1Y[
ps.addBatch(); 5|~r{w)9
} CyK$XDHa
ps.executeBatch(); @7HOL-i
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 +/b4@B7
A9qO2kq7_
事务的处理 \9|]
1、关闭Connection的自动提交 {Hp}F!X$
cn.setAutoCommit(false); NBg>i7KQ
2、执行一系列sql语句 !6tC[W`
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close n6!Ihip$
Statement sm ; Zs5I?R1e8
sm = cn.createStatement(insert into user...); "$E!_
sm.executeUpdate(); SX?$H~A
sm.close(); ^;k _
sm = cn.createStatement("insert into corp...); l5y#i7 q
sm.executeUpdate(); DKVt8/vq
sm.close(); {DXZ}7w:v
3、提交
yu?s5
cn.commit(); R
!%m5Q?5
4、如果发生异常,那么回滚 ?k:])^G5
cn.rollback();