java 数据库基本操作 }6/L5j:+
1、java数据库操作基本流程 ut6M$d4
2、几个常用的重要技巧: [Xp{ztGE
可滚动、更新的记录集 %7tQam
批量更新 l5sBDiir%
事务处理 z{h#l!Edh
`J*~B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 L<'8#J[_5
1、取得数据库连接 3w&fN3
1
1)用DriverManager取数据库连接 -TnvX(ok4
例子 Fua:& 77
String className,url,uid,pwd; T3po.Km\{
className = "oracle.jdbc.driver.OracleDriver"; :1%z;
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; t;BvKH77
uid = "system"; ENu`@S='I3
pwd = "manager"; vfID@g`!q+
Class.forName(className); QuuR_Ao?c'
Connection cn = DriverManager.getConnection(url,uid,pwd); |ocIp/$
2)用jndi(java的命名和目录服务)方式 $HjKELoJ<
例子 ?Y6MC:l<
String jndi = "jdbc/db"; om 3$=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ,:yv T6)p
DataSource ds = (DataSource) ctx.lookup(jndi); =n
$@
Connection cn = ds.getConnection(); uP,{yna(
多用于jsp中 `x;8,7W;B
2、执行sql语句 )
V}q7\G~
1)用Statement来执行sql语句 @8zp(1.
String sql; .54E*V1
Statement sm = cn.createStatement(); f.f5f%lO~
sm.executeQuery(sql); // 执行数据查询语句(select) *We.?"X'].
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?O1:-vpZ
2)用PreparedStatement来执行sql语句 qGndh
String sql; g8+w?Zn}
sql = "insert into user (id,name) values (?,?)"; p#vZYwe=L
PreparedStatement ps = cn.prepareStatement(sql); 0,)Ao8
ps.setInt(1,xxx); _ED,DM
ps.setString(2,xxx); J&,N1B
... }@IRReQ
ResultSet rs = ps.executeQuery(); // 查询 At5:X*vD
int c = ps.executeUpdate(); // 更新 z4l
O
T';<;6J**
3、处理执行结果 %(4G[R[
查询语句,返回记录集ResultSet ~$g$31/
更新语句,返回数字,表示该更新影响的记录数 tPO\ e]
ResultSet的方法 .E!p
1、next(),将游标往后移动一行,如果成功返回true;否则返回false }5n((7@X
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 <0[{Tn
<:#O*Y{
4、释放连接 1VW;[ ocQ
cn.close(); bDdJh}Vz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >`rK=?12<
}qUNXE@
可滚动、更新的记录集 XOl]s?6H$
1、创建可滚动、更新的Statement ; n2|pC^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); z1\G,mJK
该Statement取得的ResultSet就是可滚动的 Mwdh]I,#
2、创建PreparedStatement时指定参数 .K![<eZ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /'|'3J]HP
ResultSet.absolute(9000); \'(
@{
批量更新 5ug?'TOj'
1、Statement 4}{S8fGk%
Statement sm = cn.createStatement(); MFHPh8P
sm.addBatch(sql1); b`Wn98s
sm.addBatch(sql2); z-G|EAON"/
...
&y1' J
sm.executeBatch() jE)&`yZ5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 HgG-r&r!2
2、PreparedStatement &fBLPF% 6
PreparedStatement ps = cn.preparedStatement(sql); <}pwFl8C)
{ %
'>S9Ja3
ps.setXXX(1,xxx); !O$ */7
... 7I;Give{
ps.addBatch(); 66\0JsT?3
} ld1t1'I'
ps.executeBatch(); {8M=[4_`l
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7e&R6j
Oq{&hH/'}
事务的处理 *[*E|by
1、关闭Connection的自动提交 p},6W,f
cn.setAutoCommit(false); hq9b
2、执行一系列sql语句 yhr\eiJ@6
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 7 q<UJIf
Statement sm ; x&3!z[m@@
sm = cn.createStatement(insert into user...); t1HUp dHY
sm.executeUpdate(); 9GS<d.#Nvc
sm.close(); Cna@3)_
sm = cn.createStatement("insert into corp...); 8F0+\40
sm.executeUpdate(); ,hK0F3?H>
sm.close(); lo:]r.lX{
3、提交 :oF\?e
cn.commit(); yWIM,2x}
4、如果发生异常,那么回滚 P,RCbPC4
cn.rollback();