java 数据库基本操作 JEd/j
zR(
1、java数据库操作基本流程 # \M<6n{
2、几个常用的重要技巧: ~\_E%NR
yA
可滚动、更新的记录集 :dj@i6
批量更新 1 h"B-x
事务处理 d8K^`k+x
)Ob{]
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 p*'?(o:=
1、取得数据库连接 l{3utQH-=z
1)用DriverManager取数据库连接 jW*A(bK8:
例子 nAYjSE
String className,url,uid,pwd; WgL!@g
className = "oracle.jdbc.driver.OracleDriver"; NdZ:
7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; {p/m+m
uid = "system"; 9PBmBP~
pwd = "manager"; a|>MueJ
Class.forName(className); }qg!Um0
Connection cn = DriverManager.getConnection(url,uid,pwd); Tld{b
2)用jndi(java的命名和目录服务)方式 > w'6ZDA*X
例子 R's xa*VB
String jndi = "jdbc/db"; LSs={RD2+p
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Owr`ip\
DataSource ds = (DataSource) ctx.lookup(jndi); G@;aqe[dB
Connection cn = ds.getConnection(); =os j}(
多用于jsp中 {J]|mxo
2、执行sql语句 8,=$>@u
1)用Statement来执行sql语句 ~E\CAZ
String sql; ^q6~xC,/
Statement sm = cn.createStatement(); x{- caOH
sm.executeQuery(sql); // 执行数据查询语句(select) +1y#=iM{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {xr]xcM'b
2)用PreparedStatement来执行sql语句 Il642#Gh
String sql; (/M c$V
sql = "insert into user (id,name) values (?,?)"; 6 qq7:
PreparedStatement ps = cn.prepareStatement(sql); Em7q@
ps.setInt(1,xxx); wVVe L$28
ps.setString(2,xxx); jL8zH
... /IC'R"V a
ResultSet rs = ps.executeQuery(); // 查询 Zry>s0
int c = ps.executeUpdate(); // 更新 :8ZxO wwv
Y `{U45
3、处理执行结果 q}!4b'z^
查询语句,返回记录集ResultSet g[$B90
更新语句,返回数字,表示该更新影响的记录数 x<l1s
ResultSet的方法 }B5I#Af7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false )0Lq>6j9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2Ar<(v$
zaZnL7ZJX
4、释放连接 (X9V-4
cn.close(); 40<&0nn
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection A"'MRYT`
{
nV zN(
可滚动、更新的记录集 >&VL2xLy
1、创建可滚动、更新的Statement =~h54/#[I
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); s*IfXv
该Statement取得的ResultSet就是可滚动的 6~}H3rvO}
2、创建PreparedStatement时指定参数 EDo
(
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); |h7v}Y
ResultSet.absolute(9000); A=$oYBB
批量更新 W)#`4a^xj7
1、Statement Y!L jy
[/
Statement sm = cn.createStatement(); ?Z=v&d[o)
sm.addBatch(sql1); VC.?]'OqD
sm.addBatch(sql2); VPHCPGrk
... -:,h8JyMP
sm.executeBatch() r>Ln*R,9D
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8syo_sC |
2、PreparedStatement @K9T )p]
PreparedStatement ps = cn.preparedStatement(sql); No7Q,p
{ +6=!ve}
ps.setXXX(1,xxx); I?K0bs+6
... =(ZGaZ}
ps.addBatch(); 0
OBkd
} ~K9U0ypH
ps.executeBatch(); +[ItkfSod!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 nR7\ o(!
e0L;V@R
事务的处理 }$-VI\96
1、关闭Connection的自动提交 x}{VHp`|ld
cn.setAutoCommit(false); $ZS9CkN
2、执行一系列sql语句 z m'jk D|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {#,FlR2
Statement sm ; ju#63
sm = cn.createStatement(insert into user...); RVfe}4Stm#
sm.executeUpdate(); `y`xk<q
sm.close(); L?0l1P
sm = cn.createStatement("insert into corp...); F(<8:`N;G
sm.executeUpdate(); \ax%I)3
sm.close(); }kj6hnQ
3、提交 {Fi@|'
cn.commit(); :j~5(K"
4、如果发生异常,那么回滚 7m M;Q
cn.rollback();