java 数据库基本操作 J1tzHa6
1、java数据库操作基本流程 }F{C= l2
2、几个常用的重要技巧: #7] o6
可滚动、更新的记录集
,v*p
批量更新 <mZrR3v'D
事务处理 U=F-]lD
Q+b.-iWR
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Y9i9Uc.]
1、取得数据库连接 2y+70(E1
1)用DriverManager取数据库连接 \5'O.*pr
例子 $N;"}Gz
String className,url,uid,pwd; @ /UOSU
className = "oracle.jdbc.driver.OracleDriver"; 3}B5hht"D
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .-SF$U_P*a
uid = "system"; /M^V2=
pwd = "manager"; Z
7s;F}=
Class.forName(className);
AanH{
Connection cn = DriverManager.getConnection(url,uid,pwd); gX@nPZjg
2)用jndi(java的命名和目录服务)方式 b JfD\
例子 xH<'GB)
String jndi = "jdbc/db"; :tMre^oP
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _W0OM[
DataSource ds = (DataSource) ctx.lookup(jndi); $ViojW>
Connection cn = ds.getConnection(); A&<?
多用于jsp中 $D QD$
2、执行sql语句 T8$%9&j!UE
1)用Statement来执行sql语句 8jy-z"jc
String sql; VQ`,#`wV
Statement sm = cn.createStatement(); ;/@?6T"
sm.executeQuery(sql); // 执行数据查询语句(select) ]alh_U
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )A="eW_>
2)用PreparedStatement来执行sql语句 Z-(} l2\
String sql; `$S^E !=
sql = "insert into user (id,name) values (?,?)"; },DyU
PreparedStatement ps = cn.prepareStatement(sql); Z)mX,=p
ps.setInt(1,xxx); 4~O6$;!|~
ps.setString(2,xxx); dgS4w@)@V;
... CI,lkO|C
ResultSet rs = ps.executeQuery(); // 查询 96c"I;\GXX
int c = ps.executeUpdate(); // 更新 :T_'n,
Z^s+vi
3、处理执行结果 $ZQ"({<w<g
查询语句,返回记录集ResultSet
jip\4{'N
更新语句,返回数字,表示该更新影响的记录数 _yj1:TtCNT
ResultSet的方法 {Q)dU-\
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 4P|$LkI
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 (cvh3',
um;:fT+
4、释放连接 UqN{JG:#.
cn.close(); %a5t15 9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection nO~b=qO
%X;7--S%?g
可滚动、更新的记录集 <eY%sFq,
1、创建可滚动、更新的Statement *p=fi
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); H+a~o=/cR
该Statement取得的ResultSet就是可滚动的 D!oZ?dGCo6
2、创建PreparedStatement时指定参数 m}98bw
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); V1<ow'^i
ResultSet.absolute(9000); ejVdxVr \7
批量更新 QU.0Elw
1、Statement #+9rjq:v#]
Statement sm = cn.createStatement(); *C\(wL
sm.addBatch(sql1); ,eDD:#)$}
sm.addBatch(sql2); =p]mX)I_
... ;)?( 2
wP
sm.executeBatch() }|Uj"e
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6mCq/$
2、PreparedStatement .U9R>#
PreparedStatement ps = cn.preparedStatement(sql); MM#i t=u
{ wepwXy"
ps.setXXX(1,xxx); `mzb(bE
... )\wuesAO
ps.addBatch(); Edw2W8
} _#!U"hkH
ps.executeBatch(); b6"}"bG
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3?2<WEYr
7:>sc]Z
事务的处理 Q&xjF@I
1、关闭Connection的自动提交 86%%n?"}
cn.setAutoCommit(false); kn}zgSO
2、执行一系列sql语句 (ss3A9tG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close w$j{Hp6m
Statement sm ; d ;^
sm = cn.createStatement(insert into user...); l&L,7BX
sm.executeUpdate(); ZqQ*}l5
sm.close(); GRT]aw
sm = cn.createStatement("insert into corp...); =q+R
sm.executeUpdate(); jH>8bXQqZ
sm.close(); J!hFN]M<<
3、提交 }3Y
<$YL"R
cn.commit(); D9BQID$R
4、如果发生异常,那么回滚 :"<e0wDu[
cn.rollback();