java 数据库基本操作 J1Ay^*qRU
1、java数据库操作基本流程 jU~
!*]
2、几个常用的重要技巧: y3 vDKZ
可滚动、更新的记录集 +O 2H":$
批量更新 9#CE m &c
事务处理 [YQVZBT|{
Uk=-A
@q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 f,'gQ5\ X3
1、取得数据库连接 brk>oM;t
1)用DriverManager取数据库连接 1 Z5:DE<
例子 [J'O5"T
String className,url,uid,pwd; F aOfe] F
className = "oracle.jdbc.driver.OracleDriver"; |]tIE{d
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =@F1J7
uid = "system"; ?=X G#we
pwd = "manager"; K/+Y9JP9
Class.forName(className); =}6yMR!4R<
Connection cn = DriverManager.getConnection(url,uid,pwd); 6tC0F=
2)用jndi(java的命名和目录服务)方式 y6bl&_
例子 /T53"+7:0
String jndi = "jdbc/db"; OaeGukhX&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]chfa
DataSource ds = (DataSource) ctx.lookup(jndi); 8cV3VapF
Connection cn = ds.getConnection(); UE2!,Z,
多用于jsp中 ^gY^I`"e6
2、执行sql语句 YY\$lM
1)用Statement来执行sql语句 [ &cCE
String sql; WJp9io[GM
Statement sm = cn.createStatement(); /1F5khN
sm.executeQuery(sql); // 执行数据查询语句(select) Oq-O|qJj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 6 XZF8W
2)用PreparedStatement来执行sql语句 nU{}R"|
String sql; FwB}@)3
sql = "insert into user (id,name) values (?,?)"; <6_RWtU
PreparedStatement ps = cn.prepareStatement(sql); ^XsIQz[q
ps.setInt(1,xxx); TC7Rw}jF
ps.setString(2,xxx); 21b
... K+=cNC4B
ResultSet rs = ps.executeQuery(); // 查询 vhA4ol
int c = ps.executeUpdate(); // 更新 0}a="`p#<
$IZ02ZM$
3、处理执行结果 PyOj{WX>W
查询语句,返回记录集ResultSet E;Akm':
更新语句,返回数字,表示该更新影响的记录数 zGfF.q}
ResultSet的方法 ^W&qTSjh
1、next(),将游标往后移动一行,如果成功返回true;否则返回false R4 8w\?L
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 \yIan<q
v1s.j2T
4、释放连接 n]?KDID;
cn.close(); A2fc_A/a
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection MGt[zLF9
sp=;i8Y 3
可滚动、更新的记录集 D%CKkQ<u2
1、创建可滚动、更新的Statement ~J:cod
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); z}>q/!q
该Statement取得的ResultSet就是可滚动的 #GTR}|Aga
2、创建PreparedStatement时指定参数 zGDLF`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /i'dhiG
ResultSet.absolute(9000); c7~+ 5
批量更新 i&%~:K*
1、Statement -@6R`m=>
Statement sm = cn.createStatement(); R^DZ@[\iV
sm.addBatch(sql1); )=KD
sm.addBatch(sql2); Hs}3c
R}
... gj(|#n5C
sm.executeBatch() Fx6c*KNX3
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 =l7@YCj5c
2、PreparedStatement ?X'm>R. @
PreparedStatement ps = cn.preparedStatement(sql); 2pKkg>/S
{ :gD=F &V
ps.setXXX(1,xxx); rb"J{^
... "iu9r%l94
ps.addBatch(); it
Byw1/
}
9/?@2
ps.executeBatch(); }@Ap_xW
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Oz3JMZe
~F gxhK2+
事务的处理 ?Xdb%.
1、关闭Connection的自动提交 fi|k)
cn.setAutoCommit(false); +7<W.Zii
2、执行一系列sql语句 _>b=f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close <'{*6f@n
Statement sm ; 6ol*$Q"z
sm = cn.createStatement(insert into user...); 'T!^H
sm.executeUpdate(); Pdq}~um3{
sm.close(); eflmD$]SW
sm = cn.createStatement("insert into corp...); L5 -p0O`R
sm.executeUpdate(); O[$,e%
sm.close(); {`-f<>N3
3、提交 dF@m4U@L
cn.commit(); F(!9;O5J]
4、如果发生异常,那么回滚 2.,4b- ^
cn.rollback();