java 数据库基本操作 gCjH%=s
1、java数据库操作基本流程 ;|2Uf
2、几个常用的重要技巧: +k#mvPq
可滚动、更新的记录集 k0gJ('zah
批量更新 Vj#%B.#Zbf
事务处理 &8R-C[A
o:p{^D@#k
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (D:KqGqoT
1、取得数据库连接 tzx:*
1)用DriverManager取数据库连接 2pVVoZV.<
例子 j*zB
{ s
K
String className,url,uid,pwd; sxf}Mmsk
className = "oracle.jdbc.driver.OracleDriver"; n5/ZJur
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
gvvFU,2
uid = "system"; 7
3H@kf
pwd = "manager"; dOYlI`4
Class.forName(className); C!CaGf=
Connection cn = DriverManager.getConnection(url,uid,pwd); Fmy1nZ
2)用jndi(java的命名和目录服务)方式 ke{DFqh
例子 $Vd?K@W[h
String jndi = "jdbc/db"; 6nM
rO$i0k
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *g}vT8w'}
DataSource ds = (DataSource) ctx.lookup(jndi); [N'r3
Connection cn = ds.getConnection(); d#x8O4S%i2
多用于jsp中 :YkDn~@
2、执行sql语句 L5hQdT/b$
1)用Statement来执行sql语句 W66}\&5
String sql; 9aW8wYL~b
Statement sm = cn.createStatement(); yQ72v'
sm.executeQuery(sql); // 执行数据查询语句(select) \ x>NB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); +H5 jRw
2)用PreparedStatement来执行sql语句 F#zQQ)(Pf
String sql; nS?S6G5h
sql = "insert into user (id,name) values (?,?)"; m-Mhf;
PreparedStatement ps = cn.prepareStatement(sql); NB~*sP-l&
ps.setInt(1,xxx); p{('KE)
ps.setString(2,xxx); C.DoXE7
... V>~*]N^f
ResultSet rs = ps.executeQuery(); // 查询 4nX'a*'D~}
int c = ps.executeUpdate(); // 更新 A- <.#
n^g-`
3、处理执行结果 d
%F/,c-=
查询语句,返回记录集ResultSet !XG/,)A
更新语句,返回数字,表示该更新影响的记录数 {&6l\|
ResultSet的方法 V}3~7(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6%Cna0x:&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $~;6 hnrm
6
d{D3e[p^
4、释放连接 Y9lbf_51
cn.close(); si+5h6I.}
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection gK] T}
'Q^G6'(SaK
可滚动、更新的记录集 \oD=X}UQw(
1、创建可滚动、更新的Statement [qc6Q:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); '6Rs0__
该Statement取得的ResultSet就是可滚动的 z.Ve#~\
2、创建PreparedStatement时指定参数 q[We][Nrzb
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); VH$\ a~|
ResultSet.absolute(9000); `UzCq06rJ1
批量更新 F~11 _
1、Statement TLR Lng
Statement sm = cn.createStatement(); {d{WMq$
sm.addBatch(sql1); kC,DW%Ls
sm.addBatch(sql2); 1{Sx V
... G5X|JTzpu<
sm.executeBatch() }J4BxBuV8
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |iF1A
2、PreparedStatement 7ZR0M&pX
PreparedStatement ps = cn.preparedStatement(sql); l.Lc]ZpB
{ {#d`&]
ps.setXXX(1,xxx); Jf8'N
ot
... &El[
ps.addBatch(); g
tSHy*3]
} PhI{3B/
ps.executeBatch(); QvyUd%e'5A
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6.(]}?g1f
a'L7y%
事务的处理 dnhpWVhn
1、关闭Connection的自动提交 f{oxF?|89
cn.setAutoCommit(false); hyr5D9d
2、执行一系列sql语句 _^,[wD
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close RvZryA*vu
Statement sm ; 'ra_Zg[j
sm = cn.createStatement(insert into user...); OHXeqjhy
sm.executeUpdate(); `04Y ;@w
sm.close(); $4fjSSB~
sm = cn.createStatement("insert into corp...); $;g%S0:3)
sm.executeUpdate(); q0xE&[C[M
sm.close(); Lu u-c<*M
3、提交 wMR[*I/
cn.commit(); R?FtncL%D
4、如果发生异常,那么回滚 YP@?j
cn.rollback();