java 数据库基本操作 %F/tbXy{
1、java数据库操作基本流程 )I}G:bBa
2、几个常用的重要技巧: j+ys&pDczm
可滚动、更新的记录集 XJ NKM~
批量更新 ,wEM
事务处理 {k]VT4/
`RzM)ILl
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 =XS'V*
1、取得数据库连接 wYawG$@_
1)用DriverManager取数据库连接 p9sxA|O=y
例子 4-n.4j|
String className,url,uid,pwd; bKaV]Uy
className = "oracle.jdbc.driver.OracleDriver"; SO&;]YO
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; EX5kF
uid = "system"; D 7E^;W)H
pwd = "manager"; ^e 6(#SqR
Class.forName(className); fu&]t8MJC
Connection cn = DriverManager.getConnection(url,uid,pwd); `4p9K
2)用jndi(java的命名和目录服务)方式 q
B2#EsZ
例子 lJ,s}l7
String jndi = "jdbc/db"; |O+binq
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \%^3Izsc
DataSource ds = (DataSource) ctx.lookup(jndi); LOYv%9$0*p
Connection cn = ds.getConnection(); jH G(d$h
多用于jsp中 aH#|LrdJ
2、执行sql语句 Z,&ywMm/G
1)用Statement来执行sql语句 5LK>n-
String sql; 4%{m7CK}
Statement sm = cn.createStatement(); \%VoX`B
sm.executeQuery(sql); // 执行数据查询语句(select) g?+P&FL#I
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ?{dno=
2)用PreparedStatement来执行sql语句 6a!X`%N=
String sql; Zj0&/S
sql = "insert into user (id,name) values (?,?)"; fjJIF%
PreparedStatement ps = cn.prepareStatement(sql); ?k?Hp:8?=
ps.setInt(1,xxx); %qv7;E2C
ps.setString(2,xxx); 87/{\h
... ZqGq%8\.s
ResultSet rs = ps.executeQuery(); // 查询 S9BJjo
int c = ps.executeUpdate(); // 更新 n(+:l'#HJ
pVY.&XBZ$
3、处理执行结果 5VcYdu3
查询语句,返回记录集ResultSet ']NM_0
更新语句,返回数字,表示该更新影响的记录数 O#|E7;
ResultSet的方法 &pAT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false S {H8}m|MW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 w{qYP
Vqr&)i"b$
4、释放连接 eyWwE%
cn.close(); DQ}]'*@?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection iB`m!g6$
oAx0$]+%V)
可滚动、更新的记录集 WQ]pg
"
1、创建可滚动、更新的Statement ] ge-b\
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `F@yZ4L3S
该Statement取得的ResultSet就是可滚动的 M/qiA.C@W
2、创建PreparedStatement时指定参数 N@>S>U8C
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); EIfrZg7R
ResultSet.absolute(9000); o_5@R+&
批量更新 s'^#[%EgB
1、Statement s5dh]vNN
Statement sm = cn.createStatement(); Lsz`nD5
sm.addBatch(sql1); a`uT'g[*
sm.addBatch(sql2); \CGcP
... 1XKk~G"D
sm.executeBatch() Sm,$~~iq}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 xl^'U/
2、PreparedStatement ZjK~s)RC
PreparedStatement ps = cn.preparedStatement(sql); 90!Ib~7zH
{ Z-?9F`}
ps.setXXX(1,xxx); 3PGyqt(
... ;FBc^*q
ps.addBatch(); H#y"3E<s
} Mg$Z^v|}0
ps.executeBatch(); 1d"P) 3dQ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Y4O L 82Y
jj2UUQ|
事务的处理 4Ojw&ys@V
1、关闭Connection的自动提交 U{Z>y?V/
cn.setAutoCommit(false); ^J_hkw~gO
2、执行一系列sql语句 qr9F
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [8w2U%}]
Statement sm ; YB|9k)Z2[
sm = cn.createStatement(insert into user...); Vmc)or*#
sm.executeUpdate(); ZJ(!jc$"*%
sm.close(); Ymu=G3-
sm = cn.createStatement("insert into corp...); 11sW$@xs
9
sm.executeUpdate(); ;=OH=+Rl
sm.close(); _u>>+6,p
3、提交 :6+~"7T
cn.commit(); u"jnEKN0y
4、如果发生异常,那么回滚 LayU)TIt
cn.rollback();