java 数据库基本操作 JfzfxfM
1、java数据库操作基本流程 ntn ~=oL
2、几个常用的重要技巧: VLC=>w\,
可滚动、更新的记录集 [Q[ac 6f
批量更新 D
4<,YBvV
事务处理 B~`:?f9ny5
b&!x.+d-z
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9>ML;$T&
1、取得数据库连接 P.3kcZ
1)用DriverManager取数据库连接 P(B&*1X
例子 B3Ws)nF"
String className,url,uid,pwd; 6 -IThC
className = "oracle.jdbc.driver.OracleDriver"; H={5>;8G
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0}-MWbG
uid = "system"; RY]jY | E
pwd = "manager"; dC?l%,W
Class.forName(className); 9PG3cCr?
Connection cn = DriverManager.getConnection(url,uid,pwd); (t"e#b(:
2)用jndi(java的命名和目录服务)方式 f<vZ4 IU
例子 :8Ugz ~i
String jndi = "jdbc/db"; m0 ]Lc{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); yH(%*-S
DataSource ds = (DataSource) ctx.lookup(jndi); e/zz.cd){
Connection cn = ds.getConnection(); 4R&pb1eF
多用于jsp中 B:fulgh2ni
2、执行sql语句 K}QZdN']
1)用Statement来执行sql语句 @gi / 1 cq
String sql; E+P-)bRa
Statement sm = cn.createStatement(); QLb!e"C
sm.executeQuery(sql); // 执行数据查询语句(select) 95*=&d
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 7upN:7D-
2)用PreparedStatement来执行sql语句 `FByME
String sql; v(l:N@L
sql = "insert into user (id,name) values (?,?)"; j9|1G-CM
PreparedStatement ps = cn.prepareStatement(sql); `t2Y IwOK
ps.setInt(1,xxx); "cGjHy\j`
ps.setString(2,xxx); m]&y&oz
... vq1u!SY
ResultSet rs = ps.executeQuery(); // 查询 D:XjJMW3r
int c = ps.executeUpdate(); // 更新 $|K-wN[
j=Z;M1
3、处理执行结果 J'*`K>wV
查询语句,返回记录集ResultSet v4r%'bA
更新语句,返回数字,表示该更新影响的记录数 ms#|Yl1/|
ResultSet的方法 I]Vkaf I>(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false r^`~GG!,Q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Z8o8>C\d9/
8i^d*:R
4、释放连接 .s>.O6(^%
cn.close(); uM2 .?>`X
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q$x
3uH\@
Nx<fj=VJ
可滚动、更新的记录集 43Ua@KNi
1、创建可滚动、更新的Statement PDpDkcy|QM
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _.5ABE
该Statement取得的ResultSet就是可滚动的 a>egH
og
2、创建PreparedStatement时指定参数 )b-KF}]d
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :</KgR0I
ResultSet.absolute(9000); y~<_ux,
批量更新 oEsqLh9a|
1、Statement GE}>{x=^x
Statement sm = cn.createStatement(); Z;cA_}5
sm.addBatch(sql1); RH"EO4
sm.addBatch(sql2); /;`-[
... -qpe;=g&f
sm.executeBatch() .<Jq8J
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 B+[L/C}=;
2、PreparedStatement v8\pOI}c
PreparedStatement ps = cn.preparedStatement(sql); uOb}R
{ Z+
)<FX
ps.setXXX(1,xxx); -Hg,:re2
... gCM(h[7A
ps.addBatch(); YRU#/TP
} _s+_M+@et
ps.executeBatch();
cfL:#IM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 b#Vm;6BHD1
$Fv|w9
事务的处理 2 P9{?Y
1、关闭Connection的自动提交 9.Yn]O
cn.setAutoCommit(false); .> ^U
mM
2、执行一系列sql语句 9Qn*frdY,
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close vn ^*
Statement sm ; qwYq9A$+
sm = cn.createStatement(insert into user...); I~25}(IDZ"
sm.executeUpdate(); ]_2<uK}fg
sm.close(); r-5xo.J'
sm = cn.createStatement("insert into corp...); _Q}vPSJviC
sm.executeUpdate(); sLW e \o
sm.close(); _q`f5*Z[
3、提交 >H,PST
cn.commit(); *[tLwl.
4、如果发生异常,那么回滚 Q=#Wk$1.
cn.rollback();