java 数据库基本操作 iOqk*EL_r\
1、java数据库操作基本流程 fSA)G$b]
2、几个常用的重要技巧: &~-~5B|3"
可滚动、更新的记录集 1S$h<RIPAc
批量更新 2cf' ,cv@8
事务处理 2~c~{ jl\
Yck~xt&]
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 q\$6F)ha3
1、取得数据库连接 cxP6-tV%
1)用DriverManager取数据库连接 K:5eek
例子 u&]vd /
String className,url,uid,pwd; N[U9d}Zv
className = "oracle.jdbc.driver.OracleDriver"; x&=9P e(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 8#LJ* o
uid = "system"; SH8/0g?
pwd = "manager"; x#8w6@iPQ
Class.forName(className); hI|)u4q
Connection cn = DriverManager.getConnection(url,uid,pwd); $'"8QOnJ?k
2)用jndi(java的命名和目录服务)方式 I@ \#up}
例子 "5!BU&
String jndi = "jdbc/db"; .g% Y@r)=5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Hl7:*]l7b
DataSource ds = (DataSource) ctx.lookup(jndi); 0ys~2Y!eH
Connection cn = ds.getConnection(); 1 W'F3
多用于jsp中 z4M1D9iPY
2、执行sql语句 ftZj}|R!
1)用Statement来执行sql语句 w'ybbv{c
String sql; =AOWeLk*G
Statement sm = cn.createStatement(); Xl%0/o
sm.executeQuery(sql); // 执行数据查询语句(select) 9E1W|KE
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); IA*KaX2S<
2)用PreparedStatement来执行sql语句 x?r1s#88>
String sql; rZwB>c
sql = "insert into user (id,name) values (?,?)"; TGV
PreparedStatement ps = cn.prepareStatement(sql); S~F`
ps.setInt(1,xxx); 7#-y-B]l
ps.setString(2,xxx); tRfm+hqRZ
... .FP$ IWt/1
ResultSet rs = ps.executeQuery(); // 查询 9dKul,c
int c = ps.executeUpdate(); // 更新 7#2j>G{?]v
>a>fb|r
3、处理执行结果 {0yu
查询语句,返回记录集ResultSet #y; yN7W
更新语句,返回数字,表示该更新影响的记录数 BWUq%o,@g
ResultSet的方法 G '#41>q+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false vR hnX
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Hs?zq
~OFvu}]
4、释放连接 G<qIY&D'
cn.close(); 6s xz_f
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection h##WA=1QZ
U/w. M_S
可滚动、更新的记录集 O\beKBT;
1、创建可滚动、更新的Statement <GIwRVCU
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); raB+,Oi$G
该Statement取得的ResultSet就是可滚动的 0[a}n6XTk
2、创建PreparedStatement时指定参数 cFZCf8:zB
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %3=J*wj>D
ResultSet.absolute(9000); ,x_Z JL
批量更新 K"{HseN{
1、Statement RKkGITDk
Statement sm = cn.createStatement(); ^toAw8A=@0
sm.addBatch(sql1); :FQ1[X1xm
sm.addBatch(sql2); pY}/j;.[
... sbsu(Sz+
sm.executeBatch() V1bh|+o9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |V&G81sM
2、PreparedStatement i|$z'HK;+
PreparedStatement ps = cn.preparedStatement(sql); Ax<\jW<
{ Z<z;L<tJ 9
ps.setXXX(1,xxx); Cmd329AH
... Rp.W,)i
ps.addBatch(); eaZQ2
} _sMs}?^
ps.executeBatch(); r%=[},JQ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [ygF0-3ND
+m$5a
YX
事务的处理 #V_GOy1-
1、关闭Connection的自动提交 VWf %v
cn.setAutoCommit(false); /iM$Tb5
2、执行一系列sql语句 79Bg]~}Z
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?y7w} W
Statement sm ; Of7+/UV
sm = cn.createStatement(insert into user...); >Hwc,j
q
sm.executeUpdate(); RA1yr+)
sm.close(); ~1(j&&kXet
sm = cn.createStatement("insert into corp...); 'jaoO9KY
K
sm.executeUpdate(); F9Z@x)
sm.close(); 'fW#7W
3、提交 Ka-p& Uv1<
cn.commit(); `~F5wh~
4、如果发生异常,那么回滚 Plo ,XU
cn.rollback();