java 数据库基本操作 md!6@)S-p
1、java数据库操作基本流程 V5|ANt
2、几个常用的重要技巧: k3\N.@\
可滚动、更新的记录集 D}-.<
批量更新 >.h:Y5
事务处理 ,Z.sGv
Rx%S<i;9
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ^5mc$~1`
1、取得数据库连接 _n&Nw7d2
M
1)用DriverManager取数据库连接 ngY%T5-
例子 n,la<N]
String className,url,uid,pwd; Bq0 \T
0,
className = "oracle.jdbc.driver.OracleDriver"; /--p#G h'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; t6+m` Kq
uid = "system"; gk ]QR.
pwd = "manager"; \-<BUG]=
Class.forName(className); c:[k+_Zr
Connection cn = DriverManager.getConnection(url,uid,pwd); ?J[3_!"t
2)用jndi(java的命名和目录服务)方式 "fFSZ@,r
例子 {(73*-~$
String jndi = "jdbc/db"; ]B8
A
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0.aXg "
DataSource ds = (DataSource) ctx.lookup(jndi); ]rcF/uQJ<n
Connection cn = ds.getConnection(); ;*K4{wvG
多用于jsp中 R>'
%}|v/
2、执行sql语句 ,d
G. 67
1)用Statement来执行sql语句 ``o]i{x
String sql; _z5/&tm_H
Statement sm = cn.createStatement(); q5'S<qY^
sm.executeQuery(sql); // 执行数据查询语句(select) zF&VzNR2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); T U%@_vYR
2)用PreparedStatement来执行sql语句 OvdT* g=8*
String sql; u\R?(G&
sql = "insert into user (id,name) values (?,?)"; %pWn9
PreparedStatement ps = cn.prepareStatement(sql); 6iC>CY3CG
ps.setInt(1,xxx); x)5}:b1B=
ps.setString(2,xxx); dZM^?rq
... oy+|:[v:Fk
ResultSet rs = ps.executeQuery(); // 查询 Iq$| ?MH
int c = ps.executeUpdate(); // 更新 )U^=`* 7
^E&PZA\,;
3、处理执行结果 8$00\><r
查询语句,返回记录集ResultSet -(VJ,)8t2
更新语句,返回数字,表示该更新影响的记录数 ul{x|R
ResultSet的方法 ^:nc'C gP
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ts iJK
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |diI(2w
qHtQ4_Zn;
4、释放连接 R!nf^*~
cn.close(); ?u|??z%
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 7 WJ\nK
j0=6B
可滚动、更新的记录集 {>&~kM@
1、创建可滚动、更新的Statement [m~J6WB
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .6?"<zdPU
该Statement取得的ResultSet就是可滚动的 igO>)XbsM
2、创建PreparedStatement时指定参数 b0P3S!E
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); "gJ?LojB <
ResultSet.absolute(9000); A2
l?F
批量更新 |Q?h"5i"(
1、Statement 6Z\ aJ
Statement sm = cn.createStatement(); 3^xUN|.F*V
sm.addBatch(sql1); {I#_0Q,i
sm.addBatch(sql2); i,Ct AbMx
... uo F.f$%"
sm.executeBatch() ^$c#L1
C
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 16NHzAQ
2、PreparedStatement ?HEqv$n
PreparedStatement ps = cn.preparedStatement(sql); T^bAO-d#
{ rb?7i&-
ps.setXXX(1,xxx); fv+]iK<{
... >7U/TVd&
ps.addBatch(); 1HJ:
?]
} >KKWhJ
ps.executeBatch(); a[{$4JpK
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3i^X9[.
F%>$WN#2
事务的处理 bzN[*X|
1、关闭Connection的自动提交 5#Er& 6s
cn.setAutoCommit(false); @!ChPl
2、执行一系列sql语句 -H|
982=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .qBc;u
Statement sm ; k
%I83,+
sm = cn.createStatement(insert into user...); ]xC56se
sm.executeUpdate(); ]ua3I}_B6v
sm.close(); &AiAd6
sm = cn.createStatement("insert into corp...); ]uXJjS f
sm.executeUpdate(); 0B6!$) *-i
sm.close(); ~(kEGEF
3、提交 osV6=
cn.commit(); GT{4L]C
4、如果发生异常,那么回滚 72HA.!ry
cn.rollback();