java 数据库基本操作 d#W^S[[
1、java数据库操作基本流程 NgF"1E
2、几个常用的重要技巧: bQ&%6'ck
可滚动、更新的记录集 pd.unEWwF
批量更新 )h{+pK
事务处理 x|()f3{.
NJ;m&Tm,DF
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 'Asr,[]?
1、取得数据库连接 @xBO[v
1)用DriverManager取数据库连接 yL
-}E
例子 O`aNNy
String className,url,uid,pwd; \MPbG$ ^
className = "oracle.jdbc.driver.OracleDriver"; o`
dQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; sI09X6)
uid = "system"; $Zkk14
pwd = "manager"; @gM}&G08
Class.forName(className); PzhC *" i}
Connection cn = DriverManager.getConnection(url,uid,pwd); 2U"2L^oKI
2)用jndi(java的命名和目录服务)方式 AS[j)x!
例子 CC3M7|eO3
String jndi = "jdbc/db"; ,)aUp4*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4X+I2CD
DataSource ds = (DataSource) ctx.lookup(jndi); ^&$86-PB/
Connection cn = ds.getConnection(); Tks"GlE*D
多用于jsp中 '$J M2 u
2、执行sql语句 {)
sE;p-
1)用Statement来执行sql语句 }U4mXkZF
String sql; 7r.~L
Statement sm = cn.createStatement(); t~44ub6GN`
sm.executeQuery(sql); // 执行数据查询语句(select) /-WmOn*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4gUx#_AaG
2)用PreparedStatement来执行sql语句 "/2kf)l{4
String sql; H<P d&
sql = "insert into user (id,name) values (?,?)"; hb
%F"Q
PreparedStatement ps = cn.prepareStatement(sql); @O-\s q
ps.setInt(1,xxx); &] xtx>qg<
ps.setString(2,xxx); _}T )\o
... Gvvw:]WgF
ResultSet rs = ps.executeQuery(); // 查询 qZv@ULluc
int c = ps.executeUpdate(); // 更新 Kltqe5
Wt=@6w&
3、处理执行结果 v"o@q2f_
查询语句,返回记录集ResultSet 3preBs#i
更新语句,返回数字,表示该更新影响的记录数 BMV\@Sg
ResultSet的方法 |sP0z !)b
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6BM$u v4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 S1m5z,G
#EB
Rc4>,
4、释放连接 .b^!f<j
cn.close(); >.G#\w
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 7u5H o`
3f~znO
可滚动、更新的记录集 2iOYC0`!
1、创建可滚动、更新的Statement '#.D`9YI<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); tDfHO1pS
该Statement取得的ResultSet就是可滚动的 475g-t2"@
2、创建PreparedStatement时指定参数 h^''ue"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); UN:qE oS
ResultSet.absolute(9000); '*
/$66|
批量更新 y7GgTC/H
1、Statement ,ei=w,O
Statement sm = cn.createStatement(); T7O)
sm.addBatch(sql1); QXl~a%lB
sm.addBatch(sql2); jpTk@
... oL<5hN*D
sm.executeBatch() >&F:/
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ?C
2、PreparedStatement ?I"?J/zm
PreparedStatement ps = cn.preparedStatement(sql); u]ps-R_$G
{ +4rd
N\.
ps.setXXX(1,xxx); UdA,.C0
... v$g\]QS
p
ps.addBatch(); )@y7 qb
} Fdq5:v?k
ps.executeBatch(); !C^>tmqS
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rq}xuSFI
oEj$xm_}
事务的处理 x-4d VKE*z
1、关闭Connection的自动提交 U)Tl<l<
cn.setAutoCommit(false); vz1I/IdTd
2、执行一系列sql语句 #TH(:I=[
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close eX!yIqAR
Statement sm ; Ae"|a_>fMI
sm = cn.createStatement(insert into user...); #uICHt3
sm.executeUpdate(); |B64%w>Y
sm.close(); 036QV M$
sm = cn.createStatement("insert into corp...); mQ:YHtHE.F
sm.executeUpdate(); a$bE2'cb
sm.close(); +kD JZ
3、提交 +>$Kmy[3
cn.commit(); yUO%@;
4、如果发生异常,那么回滚 l
m(mY$B*_
cn.rollback();