java 数据库基本操作 4 {rj 4P?
1、java数据库操作基本流程 aLO'.5
~^
2、几个常用的重要技巧: %OAvhutS
可滚动、更新的记录集 #9(L/)^
批量更新 [6f(3|"
事务处理 #?fKi$fS;L
}S6"$R
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 g @qrVQv
1、取得数据库连接 aW(Hn[}^
1)用DriverManager取数据库连接 5?XIp6%x
例子 /eY}0q%
String className,url,uid,pwd; l1eF&wNC
className = "oracle.jdbc.driver.OracleDriver"; % jSB9
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Wph@LRB]
uid = "system"; I6rB_~]h
pwd = "manager"; lC'U3Q&
Class.forName(className); >wf.C%
Connection cn = DriverManager.getConnection(url,uid,pwd); =p>IP"HJ
2)用jndi(java的命名和目录服务)方式 sU0W)c;
例子 a}[ 1*_G
String jndi = "jdbc/db"; WnL7 A:sZ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uc]`^,`2/
DataSource ds = (DataSource) ctx.lookup(jndi); 4#lOAzDtv
Connection cn = ds.getConnection(); :EV*8{:aLU
多用于jsp中 .dKFQH iYJ
2、执行sql语句 +MyXIWmD
1)用Statement来执行sql语句 4^_'LiX3[
String sql; &%r<_1
Statement sm = cn.createStatement(); T':} p2}w+
sm.executeQuery(sql); // 执行数据查询语句(select) rObg:(z&\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Eal*){"<,?
2)用PreparedStatement来执行sql语句 EGxCNB
String sql; >b2wFo/em
sql = "insert into user (id,name) values (?,?)"; P@FE3g
PreparedStatement ps = cn.prepareStatement(sql); ):7mK03J
ps.setInt(1,xxx); U5ME`lN*`
ps.setString(2,xxx); $3]]<oH
... _*fOn@Vwo
ResultSet rs = ps.executeQuery(); // 查询 Q/`W[Et
int c = ps.executeUpdate(); // 更新 Hv-f :P O
wyB
3、处理执行结果 3GPGwzX
|
查询语句,返回记录集ResultSet HpIWH*
更新语句,返回数字,表示该更新影响的记录数 %<{1N|
ResultSet的方法 /wU4^8Hz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *AJYSa,z
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 T&^b~T(y
zI"1.^Trn
4、释放连接 szGGw
cn.close(); _~bG[lX !
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection B{!*OC{l
?H!QV;ku
可滚动、更新的记录集 @:t2mz:^i
1、创建可滚动、更新的Statement _K3;$2d|R
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); cYz|Ux
该Statement取得的ResultSet就是可滚动的 9QHV%%
2、创建PreparedStatement时指定参数 ZoR6f\2M
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); zg$NrI&
ResultSet.absolute(9000); o^W.53yX
批量更新 5xhYOwQBo
1、Statement MG vp6/Pd
Statement sm = cn.createStatement(); a+<{!+3v
sm.addBatch(sql1); oAgU rl;R
sm.addBatch(sql2); LwcAF g|
... |O{kv}YZ
sm.executeBatch() +LF`ZXe8l
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6 -BC/
2、PreparedStatement e \.
PreparedStatement ps = cn.preparedStatement(sql); ]h'*L`
{ b\p2yJ\
ps.setXXX(1,xxx); u1`JvfLrL
... lX64IvG8+o
ps.addBatch(); t'[`"pp=
} S]?I7_
ps.executeBatch(); R%6KxN)+@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 R%"'k<`#
k,61Va
事务的处理 ZhFlR*EQ
1、关闭Connection的自动提交 byPqPSY
cn.setAutoCommit(false); 814cCrr,o
2、执行一系列sql语句 "EnxVV
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |Q$Dj!!1P
Statement sm ; vf-8DB
sm = cn.createStatement(insert into user...); EZ[e
a<
sm.executeUpdate(); /L=Y8tDt
sm.close(); s#FX2r3=Fg
sm = cn.createStatement("insert into corp...); o
@nsv&i
sm.executeUpdate(); |a=7P
sm.close(); g/gaPc*86
3、提交 $pauPEe
cn.commit(); B? 9"Ztb
4、如果发生异常,那么回滚 Z GrDa
cn.rollback();