java 数据库基本操作 9;{(.K
1、java数据库操作基本流程 | VaJ70\o
2、几个常用的重要技巧: P/ 6$TgQ
可滚动、更新的记录集 e'$[PF
批量更新 uQ_C<ii"W
事务处理 B$2GEg]Ri
N}n3 +F
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;[
Dxk$"
1、取得数据库连接 1\@PrO35J
1)用DriverManager取数据库连接 Ow> u!P!
例子 "TaLvworb4
String className,url,uid,pwd; qVfn(rZ
className = "oracle.jdbc.driver.OracleDriver"; D['J4B
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (OE S~G
uid = "system"; Ot47.z
pwd = "manager"; /hqn>t
Class.forName(className); /# Jvt
Connection cn = DriverManager.getConnection(url,uid,pwd); 7NT}
Zwf
2)用jndi(java的命名和目录服务)方式 +j F|8
例子 @:CM<+
String jndi = "jdbc/db"; I^f|U
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #'KM$l,P
DataSource ds = (DataSource) ctx.lookup(jndi); K!ogpd&X&
Connection cn = ds.getConnection(); iB
W:t
多用于jsp中 Pf4zjc
2、执行sql语句 6p)&}m9!
1)用Statement来执行sql语句 \PT!mbB?
String sql; E)m \KSwh
Statement sm = cn.createStatement(); >H;m[
sm.executeQuery(sql); // 执行数据查询语句(select) d m"R0>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); V2?{ebx`
2)用PreparedStatement来执行sql语句 '+$r7?dKP
String sql; U}X'RCM
sql = "insert into user (id,name) values (?,?)"; d!T,fz/-.
PreparedStatement ps = cn.prepareStatement(sql); -eK0 +beQ
ps.setInt(1,xxx); l]&A5tz3
ps.setString(2,xxx); yw+]S
... ~28{BY
ResultSet rs = ps.executeQuery(); // 查询 0B9FPpx? :
int c = ps.executeUpdate(); // 更新 rz|Sjtq
%KO8i)n
3、处理执行结果 P]^8Enp
查询语句,返回记录集ResultSet |7,$.MK-@
更新语句,返回数字,表示该更新影响的记录数 V+1c<LwT
ResultSet的方法 0&NM=~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;8vB7|54.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 <astIu Au
9=iMP~?xF
4、释放连接 9:RV5Dt
cn.close(); y=\&z&3$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection mp sX4
AFsieJ
可滚动、更新的记录集 ]g9SUFM
1、创建可滚动、更新的Statement #
{k$Fk
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Z-CA9&4Uh
该Statement取得的ResultSet就是可滚动的 >clVV6B
2、创建PreparedStatement时指定参数 o-_,l
J7o^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;9)nG,P3
ResultSet.absolute(9000); +ah4 K(+3
批量更新 S`mB1(h
1、Statement t4;gY298
Statement sm = cn.createStatement(); ) xV>Va8)
sm.addBatch(sql1); ]S?G]/k}
sm.addBatch(sql2); h){ #dU+&
... ZI$P Qz2i
sm.executeBatch() *j,noHUT~>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g1F9IB42@<
2、PreparedStatement T<nK/lp1t
PreparedStatement ps = cn.preparedStatement(sql); !Y UT*
{ jZ5ac=D&I
ps.setXXX(1,xxx);
`_neYT
... .u7grC C
ps.addBatch(); 2HE<WI^#h
} K-*ZS8
ps.executeBatch(); z/5TYv)S
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 i/8OC
WQw11uMt@q
事务的处理 9@M;\ @&g
1、关闭Connection的自动提交 j";L{
cn.setAutoCommit(false); &BKnJ{,H
2、执行一系列sql语句 2"
v{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2WKIO|'
Statement sm ; qixnaiZ
sm = cn.createStatement(insert into user...); {KTZSs $n
sm.executeUpdate(); z:O:g?A
sm.close(); rWM5&M
sm = cn.createStatement("insert into corp...); ;6]ag< Q
sm.executeUpdate(); 7S=]@*
sm.close(); .Q</0*sp
3、提交 gHL:XW^
cn.commit(); 0Iyb}
4、如果发生异常,那么回滚 ow,! 7|m
cn.rollback();