java 数据库基本操作 [P#^nyOh(
1、java数据库操作基本流程 hCRW0
I
2、几个常用的重要技巧: . 2_t/2
可滚动、更新的记录集
/;LteBoY
批量更新 k1;,eB
事务处理 SR>Sq2cW0
.gUceXWH3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 z{T2!w~[
1、取得数据库连接 e
iS~*@
1)用DriverManager取数据库连接 x" 21 Jh
例子 ~/?JRL=
String className,url,uid,pwd; ~:7AHK2
className = "oracle.jdbc.driver.OracleDriver";
PRmZ3
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %-"?
uid = "system"; AMqu}G
pwd = "manager"; : sIZ+3
Class.forName(className); 3$f%{~3
Connection cn = DriverManager.getConnection(url,uid,pwd); INwc@XB
2)用jndi(java的命名和目录服务)方式 7O5`&Z'-
例子 $4.mRS97g
String jndi = "jdbc/db"; 4eb<SNi
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); JtYc'%OF
DataSource ds = (DataSource) ctx.lookup(jndi); E:BEQ:(~L
Connection cn = ds.getConnection(); S!J.$Y<Ko
多用于jsp中 x)<5f|j
2、执行sql语句 ]e+IaZ[Wo
1)用Statement来执行sql语句 oiAU}iK:
String sql; pJ7wd~wF*
Statement sm = cn.createStatement(); B.fLgQK0
sm.executeQuery(sql); // 执行数据查询语句(select) FxOhF03\=[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); q|m8G
2)用PreparedStatement来执行sql语句 9R.IYnq
String sql; t!^FWr&
sql = "insert into user (id,name) values (?,?)"; [;B_ENV
PreparedStatement ps = cn.prepareStatement(sql); g3{)AX[Uy
ps.setInt(1,xxx); e
#l/jFJU
ps.setString(2,xxx); rN?
L8
... bu"Jb4_a>
ResultSet rs = ps.executeQuery(); // 查询 N]cGJU>$
int c = ps.executeUpdate(); // 更新 =DTn9}u
r$ue1bH}|
3、处理执行结果 SxXh
N
查询语句,返回记录集ResultSet X70 vDoW
更新语句,返回数字,表示该更新影响的记录数 ~h -G
ResultSet的方法 =0xuH>WY}w
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Avw"[~Xd
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 &rj6<b1A
M"F?'zTkJ
4、释放连接 #f]R:Ix>
cn.close(); @%J?[PG
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection G\h8j*o
)>at]mH
可滚动、更新的记录集 BXueOvO8
1、创建可滚动、更新的Statement @Zd+XWFw
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }4xxge?r
该Statement取得的ResultSet就是可滚动的 THQW8 V
2、创建PreparedStatement时指定参数 oMda)5 &
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); yAEOn/.~
ResultSet.absolute(9000); g=; rM8W
批量更新 j-$aa;
1、Statement l1`Zp9I
Statement sm = cn.createStatement(); 6, ag\
sm.addBatch(sql1); <Xw 6m$fr:
sm.addBatch(sql2); L.(T"`-i
... ^8)&~q*
sm.executeBatch() U0u @[9!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 R@>R@V>c
2、PreparedStatement [a;lYsOsJ
PreparedStatement ps = cn.preparedStatement(sql); )Y~q6D K
{ hXS'*vO"
ps.setXXX(1,xxx); bf3LNV|
... "n
'*_rh>+
ps.addBatch(); 9<<$uf.B
} 0<{/T*AU:
ps.executeBatch(); mquna"}N
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 &dvJg
`{I,!to
事务的处理
3@$h/xMJ
1、关闭Connection的自动提交 9}X3Q!iFb
cn.setAutoCommit(false); mL+}Ka
2、执行一系列sql语句 Ndi'b_Sh\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close uW;Uq=UN
Statement sm ; =B1t?("
sm = cn.createStatement(insert into user...); h0n0Dc{4
sm.executeUpdate(); k_V1x0sZ
sm.close(); wd*T"V3
sm = cn.createStatement("insert into corp...); F-k1yZ?^
sm.executeUpdate(); 8!>uC&bE8
sm.close(); u!g=>zEu
3、提交 /(n)I
cn.commit(); UE7P =B
4、如果发生异常,那么回滚 D]y6*Ha
cn.rollback();