java 数据库基本操作 ,b$2= JO'f
1、java数据库操作基本流程 e\b`n}nC
2、几个常用的重要技巧: R4<lln:[
可滚动、更新的记录集
YOAn4]j
批量更新 c:l]=O
事务处理 3?E&}J<n
yxBUj*3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 #2:a[
~Lf
1、取得数据库连接 jb /8?7
1)用DriverManager取数据库连接 4{qB X?
例子 ZE`lr+_Y
String className,url,uid,pwd; ?'r9"M>
className = "oracle.jdbc.driver.OracleDriver"; GyC /_ntn
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; pX=,iOF[I
uid = "system"; Y?#i{ixX6n
pwd = "manager"; [ "xn5lE
Class.forName(className); X[W]=yJJ
Connection cn = DriverManager.getConnection(url,uid,pwd); ]=!P(z|
2)用jndi(java的命名和目录服务)方式 k?VQi5M
例子 D0;tcm.$
String jndi = "jdbc/db"; rQP"Y[
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @:x"]!1
DataSource ds = (DataSource) ctx.lookup(jndi); Q!M)xNl/
Connection cn = ds.getConnection(); 7);:ZpDv%L
多用于jsp中 *g;-H&`
2、执行sql语句 `Vq`z]}
1)用Statement来执行sql语句 @+_&Y]
String sql; E:nt)Ef,
Statement sm = cn.createStatement(); oH2!5;A|
sm.executeQuery(sql); // 执行数据查询语句(select) gZT)pP
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =raA?Bp3;(
2)用PreparedStatement来执行sql语句 9B)(>~q
String sql; @gSkROCdC)
sql = "insert into user (id,name) values (?,?)"; Bfd-:`Jk
PreparedStatement ps = cn.prepareStatement(sql); j|e[s ?d
ps.setInt(1,xxx); QT#6'>&7-b
ps.setString(2,xxx); G*\h\@
... ,kgF2K!
ResultSet rs = ps.executeQuery(); // 查询 )uP[!LV[e
int c = ps.executeUpdate(); // 更新 =w<v3 wWN4
_N3}gFh>
3、处理执行结果 2*U.^]~"{
查询语句,返回记录集ResultSet 9YF$CXonE=
更新语句,返回数字,表示该更新影响的记录数 s T3p>8n
ResultSet的方法 #3kXmeyrD
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 8G ]w,eF
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 [$ :
e@F|NCQ.9
4、释放连接 r-w2\ 2
cn.close(); 2:$ k
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection uG>nV
gUB{Bh($Y
可滚动、更新的记录集 K%}}fw2RMN
1、创建可滚动、更新的Statement ,M3z!=oIGn
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); z#<P}}
该Statement取得的ResultSet就是可滚动的 tiLu75vj
2、创建PreparedStatement时指定参数 uv4 _:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Wn!G.(Jq
ResultSet.absolute(9000); #Nte^E4
批量更新 ?kt=z4h9(
1、Statement jnoL2JR[=-
Statement sm = cn.createStatement(); 30FykNh
sm.addBatch(sql1); ~_ !ts{[E
sm.addBatch(sql2); Xz;b,C&*t
... MY-.t-3
sm.executeBatch() a%hGZCI
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 >Csbjf6
2、PreparedStatement ^Y^"'"
PreparedStatement ps = cn.preparedStatement(sql); c!&Qj
{ s0{
NsK>
ps.setXXX(1,xxx); !W1eUY
... GH'O!}
ps.addBatch(); {TZE/A3D,
} u9![6$R
ps.executeBatch(); Y~oT)wTU
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Rq7p29w
-Gsl[Rc0H;
事务的处理 j"<Y!Y3
1、关闭Connection的自动提交 NMjnL&P`
cn.setAutoCommit(false); 015Owi
2、执行一系列sql语句 jeDlH6X'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =sQ(iso%f
Statement sm ; ~q%
sm = cn.createStatement(insert into user...); CKTrZxR"
sm.executeUpdate(); qmmv7==
sm.close(); BV9 *s
sm = cn.createStatement("insert into corp...);
qtSs)n
sm.executeUpdate(); 9y"TDo
sm.close(); p
q-!WQ
3、提交 lSc,AOXp
cn.commit(); |l90g|isJ
4、如果发生异常,那么回滚 Sa]mm/G
cn.rollback();