java 数据库基本操作 Y,a.9AWw)
1、java数据库操作基本流程 =m40{
2、几个常用的重要技巧: wjl?@K
可滚动、更新的记录集 Kb}N!<Z*
批量更新 4b#YpK$7U
事务处理 }A#FGH+
Y8d%L;b[D
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 YONg1.^!(
1、取得数据库连接 JmBYD[h,
1)用DriverManager取数据库连接 kN_LD-
例子 h$k(|/+
String className,url,uid,pwd; !b7H
className = "oracle.jdbc.driver.OracleDriver"; ^a(q7ZfY
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; u]}Xq{ZN
uid = "system"; |9g*rO
pwd = "manager"; U3Q'ZT
Class.forName(className); )yK!EK\
Connection cn = DriverManager.getConnection(url,uid,pwd); Wc)^@f[~<
2)用jndi(java的命名和目录服务)方式 w "D"9G
例子 ~(^[TuJC
String jndi = "jdbc/db"; Ro1l:P)C`
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [)a,rrhj
DataSource ds = (DataSource) ctx.lookup(jndi); o;O_N^_W
Connection cn = ds.getConnection(); X@cV']#V
多用于jsp中 "ZH1W9A
2、执行sql语句 =gj]R
1)用Statement来执行sql语句 [fb -G5x
String sql; |[qI2-e l?
Statement sm = cn.createStatement(); aw,8'N)
sm.executeQuery(sql); // 执行数据查询语句(select) B1GSZUd^?0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $Fo ,$
2)用PreparedStatement来执行sql语句 iX,Qh2(ig
String sql; 8-m"] o3
sql = "insert into user (id,name) values (?,?)"; eBP
N[V
PreparedStatement ps = cn.prepareStatement(sql); o(a*Fk$
ps.setInt(1,xxx); :ortyCB:H
ps.setString(2,xxx); (cMrEuv
... U9@q"v-
ResultSet rs = ps.executeQuery(); // 查询 ]s<Q-/X
int c = ps.executeUpdate(); // 更新 aH:eu<s
Ji7A9Hk
3、处理执行结果 %~eZrG.
查询语句,返回记录集ResultSet CocvEoE*z
更新语句,返回数字,表示该更新影响的记录数 B}3s=+L@8
ResultSet的方法 @}[)uH
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {!,+C0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ='mqfGRi>
k'{lo_
4、释放连接 u-? &~WA
cn.close(); a E#s#Kv
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection X4o8
l[ L{m7
可滚动、更新的记录集 T"2ye9a
1、创建可滚动、更新的Statement 'r-a:8:t^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); kAAz|dhL-
该Statement取得的ResultSet就是可滚动的 "\BLi C
2、创建PreparedStatement时指定参数 -j(/5.a
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); co;2s-X
ResultSet.absolute(9000); \=QG6&_
批量更新 h rZ\ O?j
1、Statement Qdtfi1_Y1
Statement sm = cn.createStatement(); ";GLX%C!{@
sm.addBatch(sql1); Zw }7vD0
sm.addBatch(sql2); ld3,)ZY
... *zmbo >{(
sm.executeBatch() 2;q6~Y,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ]2(
%^#qBG
2、PreparedStatement l\S..B
+
PreparedStatement ps = cn.preparedStatement(sql); KsHMAp3
{ rVz#;d!`z
ps.setXXX(1,xxx); \Q#F&q0
... rm2TWM|
ps.addBatch(); 8]0R[kjD
} Im#3sn
ps.executeBatch(); fc
M~4yP?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3GaM>w}>W
7%0PsF _
事务的处理 N!P* B$d
1、关闭Connection的自动提交 ^+}<Q#y-
cn.setAutoCommit(false); 8sL7p4
2、执行一系列sql语句 F35e/YfG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close \tQRyj\|
Statement sm ; &"d4J?io`
sm = cn.createStatement(insert into user...); NE/3aU
sm.executeUpdate(); =n;ileGm+^
sm.close(); ((H}d?^AJ
sm = cn.createStatement("insert into corp...); /at#[Pw~01
sm.executeUpdate(); }U8H4B~UtY
sm.close(); j|
257D
3、提交 {6~W2zX&
cn.commit(); f}@]dF r
4、如果发生异常,那么回滚 wD*_S}]
cn.rollback();