java 数据库基本操作 GxD`M2
1、java数据库操作基本流程 r_$*euh@
2、几个常用的重要技巧: &mVClq
可滚动、更新的记录集 e`g+Jf`AT
批量更新 K0j%\]\Tp
事务处理 G4SA
u
G7" (,L` 5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 stajTN*J
1、取得数据库连接 N? Jy
1)用DriverManager取数据库连接 3#t#NW*e
例子 fEL 9J{
String className,url,uid,pwd; d%0Gsga}
className = "oracle.jdbc.driver.OracleDriver"; q`r| DcN~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; v%cCJ SO#
uid = "system"; B_ict)}ld
pwd = "manager"; !xck
~EAS
Class.forName(className); Z[*unIk
Connection cn = DriverManager.getConnection(url,uid,pwd); lH=|Qu
2)用jndi(java的命名和目录服务)方式 p2 1|
例子 <{k{Coy
String jndi = "jdbc/db"; 3f^Pr
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \h=*pAf
DataSource ds = (DataSource) ctx.lookup(jndi); \OkZ\!<hg
Connection cn = ds.getConnection(); GB Yy^wjU
多用于jsp中 ph5{i2U0
2、执行sql语句 N`efLOMl]
1)用Statement来执行sql语句 @!dIa1Q"
String sql; *
rlVE
Statement sm = cn.createStatement(); =9ff983
sm.executeQuery(sql); // 执行数据查询语句(select) N gF7$@S
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
"LB
MYZ
2)用PreparedStatement来执行sql语句 pTq DPU
String sql; !Ea >tQ|
sql = "insert into user (id,name) values (?,?)"; ^4$4x
PreparedStatement ps = cn.prepareStatement(sql); j8Z;}Ps
ps.setInt(1,xxx); V5ZC2H
ps.setString(2,xxx); I9G^T' W
... tIDN~[1
ResultSet rs = ps.executeQuery(); // 查询
:2nsi4
int c = ps.executeUpdate(); // 更新 vwu/33
*V',@NH#Os
3、处理执行结果 ni{'V4A
查询语句,返回记录集ResultSet V:y6NfL7i'
更新语句,返回数字,表示该更新影响的记录数 ,V!"4T,Z
ResultSet的方法 9F[3B`w
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Hh;lT
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 7OmT^jV2
*tj(,:!
4、释放连接 !0?o3,of-
cn.close(); ^7+;XUyg
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection fdKE1,;
+_fFRyu>
可滚动、更新的记录集 #d,)Qe[
1、创建可滚动、更新的Statement }~zDcj_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )/'WboL
该Statement取得的ResultSet就是可滚动的 td7(444]
2、创建PreparedStatement时指定参数 Vxap+<m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); P
_fCb
ResultSet.absolute(9000); w~v6=^
批量更新 qzNb\y9G
1、Statement Jyg1z,B <
Statement sm = cn.createStatement(); ?SgFD4<~P
sm.addBatch(sql1); &zy%_U2%
sm.addBatch(sql2); fB9,#
F
... J'
uaZI>'
sm.executeBatch() {Ia1H
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1z7+:~;l
2、PreparedStatement 8%B_nVc
PreparedStatement ps = cn.preparedStatement(sql); 9R8q+2
{ 0,RYO :`
ps.setXXX(1,xxx); 5@>hjXi"Y
... ?[ )}N
_o#
ps.addBatch(); 8d5#vm
} d)-ZL*o
ps.executeBatch(); E{ c+`>CY
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 HL"c yxe
!Q|a R
事务的处理 -&7?!<f
1、关闭Connection的自动提交 UAXp;W`
cn.setAutoCommit(false); 0>CG2 SRn
2、执行一系列sql语句 [ K/l;Zd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close cJ$jU{}
Statement sm ; 9*s8%pL
sm = cn.createStatement(insert into user...); Ywhhs
}f
sm.executeUpdate(); qX\85dPn@}
sm.close(); VC/n}7p
sm = cn.createStatement("insert into corp...); *Lrrl
sm.executeUpdate(); 4dFr~ {
sm.close(); 79>x/jZka
3、提交 .Xp,|T
cn.commit(); ZPw4S2yw3.
4、如果发生异常,那么回滚 c\o_U9=n
cn.rollback();