java 数据库基本操作 wQD0vsD
1、java数据库操作基本流程 L(WL,xnBy
2、几个常用的重要技巧: W.#}qK"
q
可滚动、更新的记录集 PJxak3
批量更新 VxkCK02k
事务处理 Z>(r9R3{
z.2r@Psk
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (|0.m8D~D
1、取得数据库连接 BR& Aq
1)用DriverManager取数据库连接 hzT{3YtY2
例子 [K cki+
String className,url,uid,pwd; AfbB~Ll Bq
className = "oracle.jdbc.driver.OracleDriver"; v"P&`1=T
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Pl rkgS0J
uid = "system"; _pz,okO[V
pwd = "manager"; K0EY<Ltq
Class.forName(className); ]6$,IKE7
Connection cn = DriverManager.getConnection(url,uid,pwd); KGV.S
2)用jndi(java的命名和目录服务)方式 54q4CagFq
例子 H&w:`JYDL3
String jndi = "jdbc/db"; w(76H^e
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); GBH_r0
DataSource ds = (DataSource) ctx.lookup(jndi); K3vseor
Connection cn = ds.getConnection(); v229H<
多用于jsp中 ..t,LU@|
2、执行sql语句 0>,.c2),
1)用Statement来执行sql语句 ]{f^;y8
String sql; }xAie(
Statement sm = cn.createStatement(); *4<4
sm.executeQuery(sql); // 执行数据查询语句(select) G'ij?^?
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;{<aA 5
2)用PreparedStatement来执行sql语句 q,[k7&HS
String sql; C`\9cej
sql = "insert into user (id,name) values (?,?)"; s kN9O"^A
PreparedStatement ps = cn.prepareStatement(sql); $> "J"IX
ps.setInt(1,xxx); k:b/Gq`
ps.setString(2,xxx); Q~Ay8L+
... v,/[&ASz
ResultSet rs = ps.executeQuery(); // 查询 2v0!` &?M{
int c = ps.executeUpdate(); // 更新 ~I{EE[F>qL
9T(L"9r-e
3、处理执行结果 ;B&^yj&;
查询语句,返回记录集ResultSet e^j<jV`1
更新语句,返回数字,表示该更新影响的记录数 c_
La^HS
ResultSet的方法 r55qmPhg
1、next(),将游标往后移动一行,如果成功返回true;否则返回false z;i4N3-:
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Fi mN?s
>_XOc
4、释放连接 `NBbTQtgO
cn.close(); A_!QrM
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection O0^?f/&k
`/#f?Hk=
可滚动、更新的记录集 \|CPR6I
1、创建可滚动、更新的Statement 10p8|9rE}B
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); yn SBVb!)
该Statement取得的ResultSet就是可滚动的 `
^DjEdUN
2、创建PreparedStatement时指定参数 rwiw
Rh
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %BUEX
ResultSet.absolute(9000); _ Yfmxn8V
批量更新 QE|`&~sme
1、Statement H&M1>JtE
Statement sm = cn.createStatement(); |xn#\epy@
sm.addBatch(sql1); G6ayMw]OF
sm.addBatch(sql2); 9B
/s
... {P-xCmZ~Wt
sm.executeBatch() GL1'Zo
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 v=!YfAn
2、PreparedStatement tR kF
PreparedStatement ps = cn.preparedStatement(sql); (a[.vw^g
{ a 6%@d_A
ps.setXXX(1,xxx); bW53" `X
... XAe\s`
ps.addBatch(); MDJc[am
} (8.{+8o
ps.executeBatch(); j~bAbOX12
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ((XE\V\}Z
m`z7fi7u
事务的处理 /
s,tY74'5
1、关闭Connection的自动提交 -."kq.m*
cn.setAutoCommit(false); #ZJMlJ:q`"
2、执行一系列sql语句 Vtr3G.P^
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~.J,A\F
Statement sm ; tJNIr5o
sm = cn.createStatement(insert into user...); zh\$t]d<I
sm.executeUpdate(); 4o<*PPA1
sm.close(); %}P4kEY
sm = cn.createStatement("insert into corp...); H+ lX-,
sm.executeUpdate(); (89Ji'dc
sm.close(); ',7a E@PJ
3、提交 F@Q^?WV
cn.commit(); 7h%4]
4、如果发生异常,那么回滚 *m9{V8Yi2
cn.rollback();