java 数据库基本操作 OF}_RGKg3
1、java数据库操作基本流程 4IpFT; `q
2、几个常用的重要技巧: ,)m-nZ5
可滚动、更新的记录集 ,RH986,6V
批量更新 7i\[Q8f
事务处理 5Wjp_^!e
:O=Vr]Y8K
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 &~i
&~AJ
1、取得数据库连接 0{uX2h
1)用DriverManager取数据库连接 e;\c=J,eE
例子 Wx`IEPsVbk
String className,url,uid,pwd; e6a8ad
className = "oracle.jdbc.driver.OracleDriver"; %^A++Z$`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 1@Gv`{v
uid = "system"; $*> _0{<
pwd = "manager"; \}c50}#0
Class.forName(className); nQMN2j M
Connection cn = DriverManager.getConnection(url,uid,pwd); VUhu"h@w%
2)用jndi(java的命名和目录服务)方式
X:bgY
例子 ~0:c{v;4
String jndi = "jdbc/db"; >@W#@W*I@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Q4 S8NqE
DataSource ds = (DataSource) ctx.lookup(jndi); ~<-h# B
Connection cn = ds.getConnection(); /zAx`H
多用于jsp中 Wb$bCR#?<
2、执行sql语句 H%V[%
T4=
1)用Statement来执行sql语句 1k(*o.6
String sql; *8+YR
Statement sm = cn.createStatement(); %&NK|M+n
sm.executeQuery(sql); // 执行数据查询语句(select) T!r7RS
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =0|evC
2)用PreparedStatement来执行sql语句 y+<HS]vyV
String sql; dDn:^)
sql = "insert into user (id,name) values (?,?)"; cgAcAcmY
PreparedStatement ps = cn.prepareStatement(sql); 0SYkDI
ps.setInt(1,xxx); 9wzYDKN}
ps.setString(2,xxx); X8TZePh
... 75ob1h"
ResultSet rs = ps.executeQuery(); // 查询 ,\IZ/1
int c = ps.executeUpdate(); // 更新 e)8iPu ..
&,xM;8b
3、处理执行结果 vhW'2<(
查询语句,返回记录集ResultSet c+c^F/
更新语句,返回数字,表示该更新影响的记录数 _BV:i:z
ResultSet的方法 7BnP,Nd"W
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 1d6pQ9 N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =r2d{
V8/o@I{U[
4、释放连接 .[!
^L
cn.close(); -1:asM7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection uVocl,?.L
IYFA>*Es
可滚动、更新的记录集 {lA@I*_lj
1、创建可滚动、更新的Statement l/5/|UE9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); kW9STN
该Statement取得的ResultSet就是可滚动的 D3OV.G]`
2、创建PreparedStatement时指定参数 4$rO,W/&0
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -p }]r
ResultSet.absolute(9000); pWqahrWh
批量更新 bPEAG=l "-
1、Statement K;~dZ
Statement sm = cn.createStatement(); 4{_5z7ody
sm.addBatch(sql1); IM+PjYJ
sm.addBatch(sql2); (~#9KA1A}
... iDA`pemmi&
sm.executeBatch() x8^Dhpr6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 R?(j#bk
2、PreparedStatement sQkP@Y
PreparedStatement ps = cn.preparedStatement(sql); q)/4i9
{ z'm;H{xf
ps.setXXX(1,xxx); Ni`qU(I'|
... $FoNEr&q
ps.addBatch(); 8`D_"3j3g\
} _Cxs"to
ps.executeBatch(); |7 argk+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 bFpwq#PDW>
A U](pXK;
事务的处理 B?]^}r
1、关闭Connection的自动提交 PrCq
JY
cn.setAutoCommit(false); ^6=nL<L
2、执行一系列sql语句 1~+w7Ar=(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close <K43f#%
Statement sm ; !@Ox%vK
sm = cn.createStatement(insert into user...); +$%o#~
sm.executeUpdate(); mVxS[Gq
sm.close(); rO C~U85
sm = cn.createStatement("insert into corp...); qnOAIP:0
sm.executeUpdate(); UwLa9Dn^
sm.close(); w$p v
3、提交 oyUf/Sl
cn.commit(); @'S-nn,sO
4、如果发生异常,那么回滚 *StJ5c_kg2
cn.rollback();