java 数据库基本操作 e'dZ2;X$zo
1、java数据库操作基本流程 -)E6{
2、几个常用的重要技巧: 0+_:^z
可滚动、更新的记录集 9K#U<Q0b'
批量更新 wU5= '
事务处理 fMZc_dsW9
X6o
iOs
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 WOf*1C
1、取得数据库连接 h?&S*)1
1)用DriverManager取数据库连接 t%30B^Ii%K
例子 (%|L23
String className,url,uid,pwd; B6]M\4v
className = "oracle.jdbc.driver.OracleDriver"; <{A |Xs
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; s#V:!
7
uid = "system"; .KE2sodq
pwd = "manager"; hgF4PdO1e
Class.forName(className); 'M3V#5l)@|
Connection cn = DriverManager.getConnection(url,uid,pwd); t0o'_>*?A
2)用jndi(java的命名和目录服务)方式 ?r(Bu
例子 Ec|5'Kz]
String jndi = "jdbc/db"; N`!=z++G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?L6ACi`9
DataSource ds = (DataSource) ctx.lookup(jndi); I i J%.U
Connection cn = ds.getConnection(); YX6[m6LU
多用于jsp中 =VDtZSa!$^
2、执行sql语句 ;NrU|g/ksX
1)用Statement来执行sql语句 YBY!!qjPx
String sql; 1$rrfg
Statement sm = cn.createStatement(); 2W=am_\0e.
sm.executeQuery(sql); // 执行数据查询语句(select) I=wA)Bli1p
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); tU(vt0~b
2)用PreparedStatement来执行sql语句 \d"M&-O
String sql; 3']=w@~ O[
sql = "insert into user (id,name) values (?,?)"; t[?O*>
PreparedStatement ps = cn.prepareStatement(sql); aT%6d@g
ps.setInt(1,xxx); hS:j$je
ps.setString(2,xxx); X4:SH>U!
... *heX[D
&>)
ResultSet rs = ps.executeQuery(); // 查询 ,#QLc
int c = ps.executeUpdate(); // 更新 9Y-6e0B:
Zk75GC
3、处理执行结果 P
:D6w){
查询语句,返回记录集ResultSet A;#GU`
更新语句,返回数字,表示该更新影响的记录数 tD !$!\`O
ResultSet的方法 MbeO(Q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $4*k=+wS
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6?(vXPpT$
4+_r0
4、释放连接 Y'%k
G5nF
cn.close(); L
BP|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection f1UGDC<p9
(xhV>hsA
可滚动、更新的记录集 [X|KXlNfm
1、创建可滚动、更新的Statement -
d(RK_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 74q|FQ
该Statement取得的ResultSet就是可滚动的 gw);b)&mx
2、创建PreparedStatement时指定参数 8st~ O
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -?&s6XA%#
ResultSet.absolute(9000); &WGG
kn
批量更新 BSib/)p
1、Statement pJ 7="n
Statement sm = cn.createStatement(); *ioVLt,:R
sm.addBatch(sql1); C [h^bBq
sm.addBatch(sql2); qCaM]Y
... "G3zl{?GP
sm.executeBatch() =ADdfuKN
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 `;fk,\8t%
2、PreparedStatement *yxn*B_xZ
PreparedStatement ps = cn.preparedStatement(sql); c_YP#U
{ G*lkVQ6?
ps.setXXX(1,xxx); <X,0\U!lL
... NN;'QiE
ps.addBatch(); J|A:C[7 2
} f.&((z?rC
ps.executeBatch(); t*'U|K4L/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~)\E&c
2XN];,{
事务的处理 8hx 3pvmk
1、关闭Connection的自动提交 wkwsBi
cn.setAutoCommit(false); 1-M\K^F
2、执行一系列sql语句 "dO>P*k,
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2PSt*(
Statement sm ; \h}a?T6
sm = cn.createStatement(insert into user...); ^Gs=U[**
sm.executeUpdate(); oTqv$IzqP
sm.close(); V!94I2%#x
sm = cn.createStatement("insert into corp...); uNn]hl|x
sm.executeUpdate(); 2l9RU}
sm.close(); O$Z<R:vVA
3、提交 M>BcYbXf
cn.commit(); fq2t^c|$
4、如果发生异常,那么回滚 T+y3Ph--^
cn.rollback();