java 数据库基本操作 W4QVWn %3
1、java数据库操作基本流程 tu6c!o,@
2、几个常用的重要技巧: 7zVaj"N(
可滚动、更新的记录集 mNKe,H0
批量更新 ;6L<Syl5
事务处理 0DIaXdOdW+
n+rAbn5o$
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 g*b%
1、取得数据库连接 %$Wt"~WE"O
1)用DriverManager取数据库连接 '- 4);:(^
例子 N3MMxm_u
String className,url,uid,pwd; O%tlj@?
className = "oracle.jdbc.driver.OracleDriver"; jWiB_8-6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =JOupw
uid = "system"; q3VE\&*^F
pwd = "manager"; OlRBvfoh8
Class.forName(className); k^p|H:
Connection cn = DriverManager.getConnection(url,uid,pwd); MH 'S,^J
2)用jndi(java的命名和目录服务)方式 Mm:6+
例子 .O3i"X]
String jndi = "jdbc/db"; pYI`5B4
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Od>Ta_
DataSource ds = (DataSource) ctx.lookup(jndi); SvAz9>N4
Connection cn = ds.getConnection(); :'f#0 ox
多用于jsp中 +yVz)
X
2、执行sql语句 j S')!Wcu
1)用Statement来执行sql语句 dU3UCD+2y
String sql; XtNe) Ry
Statement sm = cn.createStatement(); vXR-#MS`}
sm.executeQuery(sql); // 执行数据查询语句(select) @PZ&/F^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); V Z}^1e
2)用PreparedStatement来执行sql语句 T#|Qexz6 @
String sql; 1G=1FGvP
sql = "insert into user (id,name) values (?,?)"; ^%)'wDK
PreparedStatement ps = cn.prepareStatement(sql); H-nk\ K<|
ps.setInt(1,xxx); <)uUAh
ps.setString(2,xxx); hc"+6xc
... 7cK#fh"hvg
ResultSet rs = ps.executeQuery(); // 查询 ]N:SB
int c = ps.executeUpdate(); // 更新 /$! /F@^
6sRn_y
3、处理执行结果 AVOzx00U
查询语句,返回记录集ResultSet Ii?<Lz
更新语句,返回数字,表示该更新影响的记录数 & *B@qQ
ResultSet的方法 AGx]srl
1、next(),将游标往后移动一行,如果成功返回true;否则返回false a"b9h{h@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 7F>5<Gv:-
DFwkd/3"
4、释放连接 ,1Suq\
L
cn.close(); c;&m}ImLe.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Pc nr
\"V7O'S)&
可滚动、更新的记录集 G+=euK2]
1、创建可滚动、更新的Statement go|/I&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ?#<Fxme
该Statement取得的ResultSet就是可滚动的 y"]?TEd
2、创建PreparedStatement时指定参数 I+!w9o2nZ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); e/6WhFN#
ResultSet.absolute(9000); @rRBo:0%
批量更新 ]sd|u[:k
1、Statement d?oupW}uu
Statement sm = cn.createStatement(); 1C{n!l
sm.addBatch(sql1); ivb&J4?y
sm.addBatch(sql2); !qV{OXdrB
... gLsl/G
sm.executeBatch() zg.'
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Kg VLXI6
2、PreparedStatement (Vf&,b@U_
PreparedStatement ps = cn.preparedStatement(sql); T8Gx oNm
{ 0<>I\UN0b
ps.setXXX(1,xxx); d}EGI
... z;zyk
ps.addBatch(); sw[1T_S>
} |[>`3p"&
ps.executeBatch(); |n \HxU3
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 (8?t0}#t
H2BD5
事务的处理 9b``l-rO
1、关闭Connection的自动提交 f+}?$'
cn.setAutoCommit(false); 6;dQ#wmg
2、执行一系列sql语句 `l9Pk\X[
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close s_hf,QH
Statement sm ; 0F8y8s
sm = cn.createStatement(insert into user...); V9`VFO
sm.executeUpdate(); @g
}r*U?
sm.close(); *Y?rls `
sm = cn.createStatement("insert into corp...); <T)9mJYr
sm.executeUpdate(); WB'&W=
sm.close(); -m(9*b{h@
3、提交 L~"~C(g
cn.commit(); 0vbn!<:
4、如果发生异常,那么回滚 SZpBbX$
cn.rollback();