java 数据库基本操作 HAr_z@#E
1、java数据库操作基本流程 p/f!\
2、几个常用的重要技巧: b-XC\
可滚动、更新的记录集 :xP$iEA`G
批量更新 w(xRL#%
事务处理 5Si\hk:o
'o*:~n
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,$qqHSd1M
1、取得数据库连接 >)IXc<"wq
1)用DriverManager取数据库连接 7berkU0P
例子 5h4E>LB.B
String className,url,uid,pwd; %Fg}"=f1
className = "oracle.jdbc.driver.OracleDriver"; g}]EIv{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; XN=Cq*3}
uid = "system"; 66+y@l1
pwd = "manager"; X;?Z_3I:5
Class.forName(className); 7JNy;$]/
Connection cn = DriverManager.getConnection(url,uid,pwd); 2m?!!Weq
2)用jndi(java的命名和目录服务)方式 2iM8V
例子 n_Ka+Y<
String jndi = "jdbc/db"; ?98]\pI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Dxwv\+7]
DataSource ds = (DataSource) ctx.lookup(jndi); <.h\%&'U
Connection cn = ds.getConnection(); i;Y@>-[e<
多用于jsp中 j_r7oARL
2、执行sql语句 7q] @Jx9
1)用Statement来执行sql语句 k9^Vw+$m
String sql; #Rkld v'
Statement sm = cn.createStatement(); )
-C9W7?I
sm.executeQuery(sql); // 执行数据查询语句(select) XI*_ti
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); C;jV{sb9c
2)用PreparedStatement来执行sql语句 Q#i^<WUpg
String sql; _ x.D< n=X
sql = "insert into user (id,name) values (?,?)"; g}-Ch#
PreparedStatement ps = cn.prepareStatement(sql); P"g
Y|}|
ps.setInt(1,xxx); CY4_=
ps.setString(2,xxx); |= frsf~?
... ;|hEXd?b
ResultSet rs = ps.executeQuery(); // 查询 B!(t<W8cu
int c = ps.executeUpdate(); // 更新 ffQ%GV_
BU="BB/[
3、处理执行结果 yq?_#r
查询语句,返回记录集ResultSet _0rHxh7}q
更新语句,返回数字,表示该更新影响的记录数 $VrKoL\ScA
ResultSet的方法 P9p{j1*;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false g1uqsqYt
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 '1}rQq Z
A!kNqJ2
4、释放连接 YORFq9a{R
cn.close(); Rro{A+[,X
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |m%M$^sZ}
&E{5k{Y
可滚动、更新的记录集 6rnehv!p
1、创建可滚动、更新的Statement y%H;o?<WX
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); |-zwl8E
该Statement取得的ResultSet就是可滚动的 sX&M+'h
2、创建PreparedStatement时指定参数 S%ri/}qI[{
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); h]94\XQ>$
ResultSet.absolute(9000); rI:KZ}GZ
批量更新 k"P2J}4eO
1、Statement F$K-Q;r]<
Statement sm = cn.createStatement(); Z w5\{Z0
sm.addBatch(sql1); fxDY:l
sm.addBatch(sql2); tH:K6^oR
... }eX_p6bBw
sm.executeBatch() X*~NE\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 @Y>3 -,o,S
2、PreparedStatement +fhyw{
PreparedStatement ps = cn.preparedStatement(sql); {/BEO=8q2
{ dv0TJ 0%
ps.setXXX(1,xxx); 0;)6ZU
... |zu>G9m
ps.addBatch(); K)qbd~<\
} sQ^>.yG
ps.executeBatch(); Y\T*8\h_[
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rI}E2J
~zz |U!TG
事务的处理 ru`;cXa,
1、关闭Connection的自动提交 ~MY(6P
cn.setAutoCommit(false); B-[SUmHr
2、执行一系列sql语句 s\&_Kbw]c
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Q;P ~'
Statement sm ; &,Q{l$`X
sm = cn.createStatement(insert into user...); -aNTFt~|[
sm.executeUpdate(); 9ok|]d P
sm.close(); R7KQ-+Zb
sm = cn.createStatement("insert into corp...); (Df<QC`0v
sm.executeUpdate(); bq4H4?j
sm.close(); 'w%N(N tq
3、提交 JMOP/]%D
cn.commit(); 7/vr!tbL`p
4、如果发生异常,那么回滚 ?E2k]y6<
cn.rollback();