java 数据库基本操作 bZfq?
1、java数据库操作基本流程 ~.U\Y
2、几个常用的重要技巧: $qZ6i
可滚动、更新的记录集 $[MAm)c:]{
批量更新 [`tNa Vg
事务处理 Q$`uZ
g;AW
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 4o@:+T:1
1、取得数据库连接 ]=xX_
1)用DriverManager取数据库连接 -OD&x%L*{3
例子 #X$s5H
String className,url,uid,pwd; Zj ^e8u=T
className = "oracle.jdbc.driver.OracleDriver"; 5{1=BZftZ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; b{-|q6
uid = "system"; :cXN
Fu\C
pwd = "manager"; zn^ G V
Class.forName(className); =<aFkBX-
Connection cn = DriverManager.getConnection(url,uid,pwd); ,`a8@
2)用jndi(java的命名和目录服务)方式 ,g"JgX
例子 UM21Cfqex
String jndi = "jdbc/db"; A8S9HXL
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); W[Z[o+7pK
DataSource ds = (DataSource) ctx.lookup(jndi); OuWRLcJ!
Connection cn = ds.getConnection(); ObreDv^,
多用于jsp中 Nqd9)WQ
2、执行sql语句 ".( G,TW
1)用Statement来执行sql语句 {dE(.Z?]!#
String sql; .s41Tc5u
Statement sm = cn.createStatement(); ta x:9j|~
sm.executeQuery(sql); // 执行数据查询语句(select) ).e}.Z6[i`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); r_tt~|s,>
2)用PreparedStatement来执行sql语句 r6aIW8
String sql; \xC#Zs[<
sql = "insert into user (id,name) values (?,?)"; Tl]yl$
PreparedStatement ps = cn.prepareStatement(sql); hV)
`e"r\s
ps.setInt(1,xxx); TPKD'@:x
ps.setString(2,xxx); q%vel.L]%
... .i|nn[H &
ResultSet rs = ps.executeQuery(); // 查询 [4dX[
int c = ps.executeUpdate(); // 更新 Hm|N{
swJQwY
3、处理执行结果 4_'B oU4
查询语句,返回记录集ResultSet -GB,g=Dk
更新语句,返回数字,表示该更新影响的记录数 ZIh)D[n
ResultSet的方法 :+
1Wmg
1、next(),将游标往后移动一行,如果成功返回true;否则返回false EaL>~:j
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 A>FWvlLw'm
WW^+X~Y
4、释放连接 q68m*1?y
cn.close(); QJjk#*?,|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection #@1(
,69547#o
可滚动、更新的记录集 H5UF r,t
1、创建可滚动、更新的Statement #!#s7^%K&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); oQo5y_o~
该Statement取得的ResultSet就是可滚动的 N:+d=G`x
2、创建PreparedStatement时指定参数 M&Ln'BC
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); WoNY8
8hT
ResultSet.absolute(9000); S9%,{y
批量更新 6'<[QoW];
1、Statement pW>{7pXn
Statement sm = cn.createStatement(); [U"/A1p
sm.addBatch(sql1);
cJTwgm?
sm.addBatch(sql2); DpT$19Q+
... ?*7Mn`
sm.executeBatch() wg\p&avvb
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Mk+G(4p
2、PreparedStatement 0O*kC43E_
PreparedStatement ps = cn.preparedStatement(sql); %9S0!h\
{ 8B(v6(h
ps.setXXX(1,xxx); )1HWD]>4
... difX7)\
ps.addBatch(); S QGYH
} nf1 `)tXG
ps.executeBatch(); * >8EMq\^
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Q[|*P ] w
_z 5W*..
事务的处理 -R\dg S3
1、关闭Connection的自动提交 <l5m\A
cn.setAutoCommit(false); %yk_(3a
2、执行一系列sql语句 /m 7~-~$V
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close D&~%w!
Statement sm ; ijzwct#.
sm = cn.createStatement(insert into user...); &Vgpv#&Cfx
sm.executeUpdate(); WBm)Q#1:
sm.close();
~vM99hW
sm = cn.createStatement("insert into corp...); jh`[Y7RJO
sm.executeUpdate(); *yjnC
sm.close(); MOnTp8
3、提交 #Q*V9kvU/H
cn.commit(); v=cQ`nou
4、如果发生异常,那么回滚 ',LC!^:~Nw
cn.rollback();