java 数据库基本操作
YeC,@d[
1、java数据库操作基本流程 LGRO En<*d
2、几个常用的重要技巧: CQ.4,S}6'
可滚动、更新的记录集 IS2Ij
批量更新 9c{%m4
事务处理 `A'I/Hf5
-`dxx)x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u rXb!e{l
1、取得数据库连接 fslk7RlSKg
1)用DriverManager取数据库连接 NzAtdcwR
例子 mK40 f
String className,url,uid,pwd; ^la i!uZVa
className = "oracle.jdbc.driver.OracleDriver"; OF<n T
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 90iW-"l+[
uid = "system"; x;FO|fH
pwd = "manager"; mnQjX ?
Class.forName(className); 2${,%8"0s
Connection cn = DriverManager.getConnection(url,uid,pwd); m0\"C-Bk
2)用jndi(java的命名和目录服务)方式 n5k^v$'
例子 4 uy @ {
String jndi = "jdbc/db"; Z#Zzi5<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); B:- KZuO
DataSource ds = (DataSource) ctx.lookup(jndi); ,}IER
Connection cn = ds.getConnection(); ]2\2/~l
多用于jsp中 39T&c85
2、执行sql语句 3TiXYH
1)用Statement来执行sql语句 7
Mki?EG
String sql; K;y\[2;}e,
Statement sm = cn.createStatement(); OpbT63@L
sm.executeQuery(sql); // 执行数据查询语句(select) TXD^Do5^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %*5g<5
2)用PreparedStatement来执行sql语句 _"!{7e`Z
String sql; |t 65#1
sql = "insert into user (id,name) values (?,?)"; :*P___S=
PreparedStatement ps = cn.prepareStatement(sql); =*:[(Py1
ps.setInt(1,xxx); W|H4i;u
ps.setString(2,xxx); ay:\P.`5)
... NkA6Cp[Q,1
ResultSet rs = ps.executeQuery(); // 查询 [wy3Ld
int c = ps.executeUpdate(); // 更新 S?nNZW\6[
Z|:_c
3、处理执行结果 Og$eQS
查询语句,返回记录集ResultSet }`9fZK{. @
更新语句,返回数字,表示该更新影响的记录数 e(n2+S#N
ResultSet的方法 1Fvv/Tj
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 0$"Q&5Y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Nx4DC
c;21i;&,9
4、释放连接 `!,\kc1
cn.close(); v[,v{5b
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >^T,U0T])
|P. =
可滚动、更新的记录集 n$hqNsM
1、创建可滚动、更新的Statement ;H
y!0n
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); E%k ]cZ
该Statement取得的ResultSet就是可滚动的 `FYtiv?G
2、创建PreparedStatement时指定参数 Ng."+&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); XU;{28P
ResultSet.absolute(9000); 4lY&=_K[)
批量更新 M=\d_O#;Z
1、Statement A|
gs Uh
Statement sm = cn.createStatement(); !8
wid&
sm.addBatch(sql1); UPVO~hB;
sm.addBatch(sql2); 7dufY
} }
... iO?gF
sm.executeBatch() c+E//X|
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 SrQ4y`?
2、PreparedStatement &v3D" J
PreparedStatement ps = cn.preparedStatement(sql); f#;ubfi"z
{ L_
Xn,
ps.setXXX(1,xxx); $LxG>db
... GFQG(7G9
ps.addBatch(); h=v[i!U-eY
} K4?t' dd]
ps.executeBatch(); 9{9#AI.G
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ,);=
(r9
f
gK2.;>
事务的处理 8g#
c%eZ
1、关闭Connection的自动提交 )I Y 5Y
cn.setAutoCommit(false); VGTeuu5i
2、执行一系列sql语句 t3
uB
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close e-%7F]e
Statement sm ; ;Xfd1
sm = cn.createStatement(insert into user...); |iwM9oO%
sm.executeUpdate(); r6oX6.c
sm.close(); ONr?.MJ6j
sm = cn.createStatement("insert into corp...); :>tF_6
sm.executeUpdate(); S|{Yvyp
sm.close(); {UX"Epd);n
3、提交 5bF9IH
cn.commit(); 'uP'P#
4、如果发生异常,那么回滚 (opROsFh
cn.rollback();