java 数据库基本操作 1>1!oml1E
1、java数据库操作基本流程 M:N>{_1&
2、几个常用的重要技巧: V qf}(3K0
可滚动、更新的记录集 6 ?cV1:jh
批量更新 ^m\n[<x^
事务处理 -v]
0@jNe
8~7EWl
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 X.Kxio
$o
1、取得数据库连接 w *0T"hK
1)用DriverManager取数据库连接 U*t`hn-xs
例子 f,*e?9@;s
String className,url,uid,pwd; y|ZJ-[qg
className = "oracle.jdbc.driver.OracleDriver"; {S c1!2q
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Sw~<W%! ?
uid = "system"; h 9/68Gc?6
pwd = "manager"; yL1\V7GI{[
Class.forName(className); O;r8l+
Connection cn = DriverManager.getConnection(url,uid,pwd); #0tM88Wi
2)用jndi(java的命名和目录服务)方式 MwZ`NH|n3"
例子 nr }H;wB
String jndi = "jdbc/db"; v{+*/NQ_
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +%^D)
DataSource ds = (DataSource) ctx.lookup(jndi); [@)|j=:i:
Connection cn = ds.getConnection(); bbnAmZ
多用于jsp中 ~2H)#`\ac8
2、执行sql语句 Cv3H%g+as
1)用Statement来执行sql语句 SU^/qF%8
String sql; 4Y'qoM;
Statement sm = cn.createStatement(); m-K6y7t
sm.executeQuery(sql); // 执行数据查询语句(select) _IGQ<U <z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); rB\UNXy
2)用PreparedStatement来执行sql语句 ^?,/_ 3
String sql; k58lmuU
sql = "insert into user (id,name) values (?,?)"; 3e"G.0vJ
PreparedStatement ps = cn.prepareStatement(sql); KMv|;yXYj4
ps.setInt(1,xxx); iJAW| dw}
ps.setString(2,xxx); h$3Y,-4
... @/~41\=e
ResultSet rs = ps.executeQuery(); // 查询 qe0@tKim
int c = ps.executeUpdate(); // 更新 {=kA8U
ITTC}
3、处理执行结果 v^pE=f*/
查询语句,返回记录集ResultSet h^4oy^9
更新语句,返回数字,表示该更新影响的记录数 ,Tpds ^
ResultSet的方法 $W)FpN;CW/
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ?mMd6U&J
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )pJzw-m"
X~x]VKr/
4、释放连接 tC&Xm}:
cn.close(); _ge3R3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection phTZUmi
G[jCmkK
可滚动、更新的记录集 hFKYRZtP.8
1、创建可滚动、更新的Statement $`i&\O2*
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); @$aCUJ/mE
该Statement取得的ResultSet就是可滚动的 6w5 4+n
2、创建PreparedStatement时指定参数 ,]+6kf 5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); y 8sI @y6
ResultSet.absolute(9000); <I}k%q'
批量更新 mu*wX'.'
1、Statement jjs-[g'}
Statement sm = cn.createStatement(); "<kmiK/
sm.addBatch(sql1); xv
/w %
sm.addBatch(sql2); TJCoID7a8
... 1m&(3%#{
sm.executeBatch() UrgvG, Lt
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 }/6jom9U?
2、PreparedStatement ~-,<`VY
PreparedStatement ps = cn.preparedStatement(sql); -Q,lUP
{ 5dhRuc
ps.setXXX(1,xxx); F3?v&
... V&gUxS]*
ps.addBatch(); :Y"f.>
} Qv8Z64#
ps.executeBatch(); &9'6hMu
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 KzhldMJ^zq
@wB$qd;v
事务的处理 O,7P6
1、关闭Connection的自动提交 #<)u%)`
cn.setAutoCommit(false); EF}Z+7A
2、执行一系列sql语句 X)Kd'6zg
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -~jM=f$
Statement sm ; e-Eoe_k
sm = cn.createStatement(insert into user...); .
a~J.0co
sm.executeUpdate(); sLCL\dWT
sm.close(); XI
pXP,Yy
sm = cn.createStatement("insert into corp...); ;i1H {hB
sm.executeUpdate(); :.@gd7T
sm.close(); <^M`U>
3、提交 ?g!py[CrE
cn.commit(); norWNm(n
4、如果发生异常,那么回滚 W"$'$h
cn.rollback();