java 数据库基本操作 !qve1H4d2
1、java数据库操作基本流程 HjR<4;2
2、几个常用的重要技巧: .;6bMP[YA
可滚动、更新的记录集 eA^|B zU
批量更新 lI<8)42yq
事务处理 xWV7#Z7
K6hNN$F!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 d_B5@9e#
1、取得数据库连接 KphEw[4/
1)用DriverManager取数据库连接 JwVv+9hh
例子 "//
8^e%Xo
String className,url,uid,pwd; 6*
w;xf
className = "oracle.jdbc.driver.OracleDriver"; Z] }@#/
n
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .JjuY'-Q
uid = "system"; ?!Gt.
fb
pwd = "manager"; >X)G`N@!
Class.forName(className); FM];+d0
Connection cn = DriverManager.getConnection(url,uid,pwd); z8MYgn7
2)用jndi(java的命名和目录服务)方式 /% 1lJD
例子
KguFU
String jndi = "jdbc/db";
Q)&Ztw<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /9Xf[<
DataSource ds = (DataSource) ctx.lookup(jndi); FFGTIT# {"
Connection cn = ds.getConnection(); nfB9M1Svn
多用于jsp中 +[+Jd)Z
2、执行sql语句 f;a6ux#
1)用Statement来执行sql语句 K)OlCpHc
String sql; [*v\X %+
Statement sm = cn.createStatement(); k/O&,T77}J
sm.executeQuery(sql); // 执行数据查询语句(select) 2[eY q1f!
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); eyV904<F
2)用PreparedStatement来执行sql语句 u{ /gjv
String sql; MvFXVCT#
sql = "insert into user (id,name) values (?,?)"; 0}N^l=jQ
PreparedStatement ps = cn.prepareStatement(sql); ln7.>.F
ps.setInt(1,xxx); ;k]pq 4E
ps.setString(2,xxx); ]W,g>91m
... 8Qh/=Ir
ResultSet rs = ps.executeQuery(); // 查询 ~JiA
int c = ps.executeUpdate(); // 更新 mHy]$Z
\Qn8"I83AV
3、处理执行结果 jL<.?HE
查询语句,返回记录集ResultSet :QNEA3Q
更新语句,返回数字,表示该更新影响的记录数 nFSa~M
ResultSet的方法 :nt%z0_
1、next(),将游标往后移动一行,如果成功返回true;否则返回false gu!A:Q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 OoNAW<
@@ QU"8q
4、释放连接 0a5P@;"a
cn.close(); ;z#9>99rH
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [A47OR
x4K5
可滚动、更新的记录集 &~8}y+z
1、创建可滚动、更新的Statement 4w,}1uNEf
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); RWE%?`
该Statement取得的ResultSet就是可滚动的 Yu=^`I
2、创建PreparedStatement时指定参数 >vhyKq|g<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Z:Wix|,ONS
ResultSet.absolute(9000); ~A)$= "
批量更新 IP3-lru
1、Statement [*(MI 9WM
Statement sm = cn.createStatement(); Velmq'n
sm.addBatch(sql1); shB(kb{{
sm.addBatch(sql2); <~3 aaO
... =[,adB
sm.executeBatch() h;6@-\6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ':=C2x1d|
2、PreparedStatement 8"@<s?0\"
PreparedStatement ps = cn.preparedStatement(sql); IO4 IaeM
{ >,v~,<3
i
ps.setXXX(1,xxx); 2-~oNJqX
... y.Py>GJJ1S
ps.addBatch(); 5^k#fl2
} C"}x=cK
ps.executeBatch(); &P;x<7h$t?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 z} %to0W
<j>@Fg#q
事务的处理 ;u%h wlo
1、关闭Connection的自动提交 $2.DZ
cn.setAutoCommit(false); MG6Tk(3S
2、执行一系列sql语句 $#!~K2$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >@X=E3
Statement sm ; VYwaU^
sm = cn.createStatement(insert into user...); \=@}(<4
sm.executeUpdate(); Wwz>tE
sm.close(); H`P )
sm = cn.createStatement("insert into corp...); gR+Z"]
sm.executeUpdate(); -'nx7wnj2
sm.close(); {`'b+0[;@
3、提交 _eF*8 /z
cn.commit(); *,. {Xf
4、如果发生异常,那么回滚 IkvH8E
cn.rollback();