java 数据库基本操作 &%}6&PWi
1、java数据库操作基本流程 S
v$%-x^t
2、几个常用的重要技巧: AF>J8 V
可滚动、更新的记录集 *pCT34'--
批量更新 J84Q|E
事务处理 %%}U
-*b
%vDN{%h8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 aRdzXq#x
1、取得数据库连接 |vw0:\/H
1)用DriverManager取数据库连接 Dx/BxqG6}_
例子 (\>3FwFHW|
String className,url,uid,pwd; (V)nHF*<>
className = "oracle.jdbc.driver.OracleDriver"; /\hybx'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; r*fZS$e
uid = "system"; Q}2aBU.f
pwd = "manager"; J1T_wA_
Class.forName(className); oQ1>*[e<u
Connection cn = DriverManager.getConnection(url,uid,pwd); KyK%2:
2)用jndi(java的命名和目录服务)方式 K>Dn#"{Y
例子 9o"k
7$
String jndi = "jdbc/db"; $a>,sL&;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +*]"Yo~]}
DataSource ds = (DataSource) ctx.lookup(jndi); D.9qxM"Z>
Connection cn = ds.getConnection(); W~z
2Q
so
多用于jsp中 +hI:5(_
2、执行sql语句 Va"Q1 *"
1)用Statement来执行sql语句 fgK1+sW
String sql; Pk !RgoWF
Statement sm = cn.createStatement(); Eq=~S O%
sm.executeQuery(sql); // 执行数据查询语句(select) [QEV6S]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); \wEHYz
2)用PreparedStatement来执行sql语句 c"Ddw'?e
String sql; $n\{6Rwb
sql = "insert into user (id,name) values (?,?)"; 1%68Pnqk
PreparedStatement ps = cn.prepareStatement(sql); ABw:SQ6=Q
ps.setInt(1,xxx); eme7y
ps.setString(2,xxx); nj$TdwZbK
... Kur3Gf X
ResultSet rs = ps.executeQuery(); // 查询 ]KdSwIbi
int c = ps.executeUpdate(); // 更新 iqm]sC`
VPoA,;Y"-
3、处理执行结果 mD<- <]SYp
查询语句,返回记录集ResultSet T^> ST
更新语句,返回数字,表示该更新影响的记录数 >7i&(6L
ResultSet的方法 $(/=Wn
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
_GS_R%b
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 +e}v)N
7yM=$"'d
4、释放连接 ~(OG3`W!
cn.close(); lKWe=xY\B
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection !_C*2+f
RC'4%++Nz
可滚动、更新的记录集 2wLnRP`*
1、创建可滚动、更新的Statement $`,10uw
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *;cvG?V
该Statement取得的ResultSet就是可滚动的 :}'5'oVG
2、创建PreparedStatement时指定参数 vqO d`_)
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); DSjEoWj
ResultSet.absolute(9000); X5@+M!`
批量更新
|Hx#Uk#
1、Statement SO @d\H
Statement sm = cn.createStatement(); n@|5PI"bx
sm.addBatch(sql1); 5My4a9
sm.addBatch(sql2); M3 MB{cA2
... Iv])s
sm.executeBatch() }7?_>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6G.(o
2、PreparedStatement C.qNBl*
PreparedStatement ps = cn.preparedStatement(sql); 'D_a2xo0
{ =rz7 x
ps.setXXX(1,xxx); :%G_<VAo!
... o;#:%
ps.addBatch(); lTb4quf8I
} ymH>]
cUm
ps.executeBatch(); m1bkY#\ U|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [g)HoR=&
y7pwYRY
事务的处理 Z~R7 G
1、关闭Connection的自动提交 y5/frJ
cn.setAutoCommit(false); 6mp8v`b
2、执行一系列sql语句 #+CH0Z
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close sgYPR
Statement sm ; gOiZ8K!
sm = cn.createStatement(insert into user...); 3.?G,%S5.$
sm.executeUpdate(); ` /
<y0H
sm.close(); Sc b'
sm = cn.createStatement("insert into corp...); xqm-m
sm.executeUpdate(); /bdL.Y# V
sm.close(); U]/iPG&_
3、提交 "x1?T+j4
cn.commit(); Me;XG?`
4、如果发生异常,那么回滚 /q1k)4?E
cn.rollback();