java 数据库基本操作 8kdJ;%^N
1、java数据库操作基本流程 g9~QNA
2、几个常用的重要技巧: >DM^/EAG{
可滚动、更新的记录集 iQd,xr
批量更新 ^7Z#g0{^w
事务处理 2I[(UMI$7
e^=b#!}-5:
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 =|+%^)E
1、取得数据库连接
KP@bz
1)用DriverManager取数据库连接 "J(T?|t
例子 5ho!}K
String className,url,uid,pwd; `8 Ann~Z|k
className = "oracle.jdbc.driver.OracleDriver"; E$"`|Df
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Sdzl[K/}
uid = "system"; 5M v<8P~
pwd = "manager"; 6N\f>c
Class.forName(className); [AHoTlPZ
Connection cn = DriverManager.getConnection(url,uid,pwd); +b
sc3
2)用jndi(java的命名和目录服务)方式 pQ,|l$^m
例子 GI5#{-)
String jndi = "jdbc/db"; R$m?aIN
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |S6L[Uo
DataSource ds = (DataSource) ctx.lookup(jndi); 0_&5S`tj
Connection cn = ds.getConnection(); n@=D,'cn
多用于jsp中
@f!r"P]
2、执行sql语句 ]mR!-Fqj
1)用Statement来执行sql语句 mI>=S
String sql; 'w"hG$".
Statement sm = cn.createStatement(); Xk>YiV",?
sm.executeQuery(sql); // 执行数据查询语句(select) > I>=/i^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )z\ 73|w
2)用PreparedStatement来执行sql语句 he!Uq%e
String sql; 'ZFbyt Q2
sql = "insert into user (id,name) values (?,?)"; c BcZ@e;
PreparedStatement ps = cn.prepareStatement(sql); STjk<DP(
ps.setInt(1,xxx); yedEI[_4
ps.setString(2,xxx); *";O_ :C!
... k0bDEz.X
ResultSet rs = ps.executeQuery(); // 查询 1v~1?+a\2
int c = ps.executeUpdate(); // 更新 ThiM6Hb
U[O7}Nsb"
3、处理执行结果 'T+v&M
查询语句,返回记录集ResultSet f0@4>\g
更新语句,返回数字,表示该更新影响的记录数 {i"th(J$
ResultSet的方法 Oil~QAd,
1、next(),将游标往后移动一行,如果成功返回true;否则返回false oiRrpS\T.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ' e:rL.
$!goM~pZ
4、释放连接 !d
Z:Ih.[{
cn.close(); [R0E4A?M
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection HVz|*?&6
O77^.B
可滚动、更新的记录集 >&[q`i{
1、创建可滚动、更新的Statement O0_kLH$.
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /l` "@
该Statement取得的ResultSet就是可滚动的 E#n=aY~u-
2、创建PreparedStatement时指定参数 /?%1;s:'
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =m-nvXD
ResultSet.absolute(9000); {d '>J<Da
批量更新 yvCX
is
1、Statement \AOHZ r
Statement sm = cn.createStatement(); \R[f< K%
sm.addBatch(sql1); P`L, eYc
sm.addBatch(sql2); ePo :::
... LV8{c!"
sm.executeBatch() X:JU#sI
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 rVM?[_'O
2、PreparedStatement *J3Z.fq%:i
PreparedStatement ps = cn.preparedStatement(sql); 'FM_5`&
{ 2l}H=DZV
ps.setXXX(1,xxx); Oj1B @QE
... 9j>LU<Z
ps.addBatch(); G%MdZg&i
} Z8I0v$LjR
ps.executeBatch(); =rN_8&
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ih=O#f|
3H`r|R
事务的处理 BIxjY!!"
1、关闭Connection的自动提交 m\f}?t
cn.setAutoCommit(false); Ksf f]##H
2、执行一系列sql语句 q0*d*j F0u
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close F;8Uvj
Statement sm ; u=
Vt3%q
sm = cn.createStatement(insert into user...); o(stXa
sm.executeUpdate(); J+u z{
sm.close(); gaU(ebsE
sm = cn.createStatement("insert into corp...); n{"e8vQx
sm.executeUpdate(); u>*d^[zS
sm.close(); -ZH6*7!
3、提交 HX#$ ^@Q(
cn.commit(); 8SN4E
4、如果发生异常,那么回滚 a9!.e
rM
cn.rollback();