java 数据库基本操作 MdV-;uf
1、java数据库操作基本流程 _l<e>zj
2、几个常用的重要技巧: vc0'x4
可滚动、更新的记录集 -]C3_ve
批量更新 -|"W|K?nq
事务处理 &-mPj82R
mI_ ?hl?Pv
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 iaPrkMhd
1、取得数据库连接 wi-O}*O
1)用DriverManager取数据库连接 zUF%`CR
例子 ?j6?KR@#
String className,url,uid,pwd; yj13>"n h
className = "oracle.jdbc.driver.OracleDriver"; ?`#)JG,A7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #
xx{}g]%
uid = "system"; t2Q40'
`
pwd = "manager"; sN]O]qYXJ
Class.forName(className); >AX&PMb`
Connection cn = DriverManager.getConnection(url,uid,pwd); _BHR ?I[w
2)用jndi(java的命名和目录服务)方式 bKRz=$P?
例子 65X$k]x
String jndi = "jdbc/db"; jODx&dVr
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); tXDO@YH3S
DataSource ds = (DataSource) ctx.lookup(jndi); T1sb6CT
Connection cn = ds.getConnection(); )4q0(O)d
多用于jsp中 I
CCmE#n
2、执行sql语句 E`]lr[
1)用Statement来执行sql语句
KV v0bE
String sql;
>G(M&
Statement sm = cn.createStatement(); n#8N{ya5x1
sm.executeQuery(sql); // 执行数据查询语句(select) w7GF,a
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
;j|T#-.
2)用PreparedStatement来执行sql语句 O{:_-eI&d
String sql; O4H %x
sql = "insert into user (id,name) values (?,?)"; k<x
%
PreparedStatement ps = cn.prepareStatement(sql); fbgq+f`\
ps.setInt(1,xxx); c
4xh
ps.setString(2,xxx); gb:)t}|
... >T:
Yp<
ResultSet rs = ps.executeQuery(); // 查询 %P05k
int c = ps.executeUpdate(); // 更新 6P@3UQ)}s
8#b>4Dx
3、处理执行结果 G$FNofQx
查询语句,返回记录集ResultSet tai
更新语句,返回数字,表示该更新影响的记录数 Hry*.s -
ResultSet的方法 j[2?}?
1、next(),将游标往后移动一行,如果成功返回true;否则返回false EA_6L\+8&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 o0t/
C QO gR GW
4、释放连接 unn2MP'
cn.close(); \@6PA
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection _o'_ z ]
QhV!%}7
可滚动、更新的记录集 zfAHE{c
1、创建可滚动、更新的Statement =I.
b2e1z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); OY$P8y3MY
该Statement取得的ResultSet就是可滚动的 $!F_K
2、创建PreparedStatement时指定参数 '!Gnr[aR
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); qo{2 CYG\+
ResultSet.absolute(9000); 29#&q`J
批量更新 PgZeDUPP
1、Statement wa/
:JE
Statement sm = cn.createStatement(); 3%c{eZxG=
sm.addBatch(sql1);
ETQ.A< v
sm.addBatch(sql2); H3<
`
... @ChEkTn
sm.executeBatch() d9@!se9&Z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 K& /
rzs-
2、PreparedStatement U)mg]o-VE
PreparedStatement ps = cn.preparedStatement(sql); =<~/U?
{ `}uOlC]I
ps.setXXX(1,xxx); 3e~X`K1Q<
... 96M?tTa
ps.addBatch(); % heX06
} [;O 6)W
ps.executeBatch(); Ji%6/zV
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 'uAH, .B
i&KD)&9b#
事务的处理 z=q
1、关闭Connection的自动提交 qgTN %%"~
cn.setAutoCommit(false); >9KQWeD
2、执行一系列sql语句 @#sBom+K`
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |4RuT
.-o
Statement sm ; O}VI8OB(&
sm = cn.createStatement(insert into user...); 5G-)>
sm.executeUpdate(); F^Q[P4>m\
sm.close(); \VJ7ahg[\
sm = cn.createStatement("insert into corp...); f?xc-lX5R
sm.executeUpdate(); 9AJMm1_
sm.close(); L\p@1N?K
3、提交 uYk4qorA
cn.commit(); doJ\7c5uU
4、如果发生异常,那么回滚 MN|8(f5Gs
cn.rollback();