java 数据库基本操作 ^]0Pfna+N
1、java数据库操作基本流程 ;oKZ!ND
2、几个常用的重要技巧: 6"5A%{J
可滚动、更新的记录集 6"O+w=5B
批量更新 {
Vf XsI
事务处理 r|fL&dtr
RSyUaA
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 y@: h4u"3
1、取得数据库连接 mCsMqDH
1)用DriverManager取数据库连接 )D5"ap]fX
例子 4I
k{
String className,url,uid,pwd; )@l%
className = "oracle.jdbc.driver.OracleDriver"; BB!THj69a6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; b"uu
uid = "system"; P%:wAYz1^O
pwd = "manager"; ~"&|W'he[
Class.forName(className); (ybI\UI
Connection cn = DriverManager.getConnection(url,uid,pwd); WwBOM~/`2
2)用jndi(java的命名和目录服务)方式 ;!mzyb*
例子 Vl/+;6_
String jndi = "jdbc/db"; d *|Y
o
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); L~rBAIdD
DataSource ds = (DataSource) ctx.lookup(jndi); vrhT<+q
Connection cn = ds.getConnection(); 9`A;U|~E@
多用于jsp中 Hz1%x
2、执行sql语句 t?x<g <PJ4
1)用Statement来执行sql语句 wOEj)fp.
String sql; ,c$_t+
Statement sm = cn.createStatement(); j_!F*yul
sm.executeQuery(sql); // 执行数据查询语句(select) 7{)G_?Q&
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9~5uaP$S
2)用PreparedStatement来执行sql语句 jrlVvzZ
String sql; ~ Ei $nV
sql = "insert into user (id,name) values (?,?)"; ^& tZ
PreparedStatement ps = cn.prepareStatement(sql); 9N%We|L,c
ps.setInt(1,xxx); n.`($yR_
ps.setString(2,xxx); 5T_n %vz
... 7$vYo
_
ResultSet rs = ps.executeQuery(); // 查询 a LroD$#
int c = ps.executeUpdate(); // 更新 mPtZO*Fc
4$iz4U:P
3、处理执行结果 uk<4+x,2)
查询语句,返回记录集ResultSet 8 S:w7Hr
更新语句,返回数字,表示该更新影响的记录数 <EB+1GFuI
ResultSet的方法 B:;pvW]
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @fZ,.2ar
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 I {S;L
HZzD VCU
4、释放连接 G_3O]BMKd)
cn.close(); j^j1
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection /7nb,!~~l
uy[At+%zg
可滚动、更新的记录集 ]Yn D
1、创建可滚动、更新的Statement \=?a/
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); @Q
]=\N:
该Statement取得的ResultSet就是可滚动的 7 S#J>*
2、创建PreparedStatement时指定参数 UqFO|r"M
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); LEbB(x;@
ResultSet.absolute(9000);
{7"Q\
批量更新 n/;WxnnQ
1、Statement ]_mb7X>
Statement sm = cn.createStatement(); $<dH?%!7
sm.addBatch(sql1); ;v)JnbsH}
sm.addBatch(sql2); ld|5TN1
... {3>$[bT
sm.executeBatch() fnjPSts0
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :j9l"5"
2、PreparedStatement zH?!
PreparedStatement ps = cn.preparedStatement(sql); VuhGx:Xl
{ l[mWf
ps.setXXX(1,xxx); Gv!2f
... 6"LcJ%o
ps.addBatch(); ~9a<0Mc?
} I+%[d^,
ps.executeBatch(); x*/tyZg6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [64:4/<}
\+oQd=K@
事务的处理 7{e
4c
1、关闭Connection的自动提交 o8V5w!+#
cn.setAutoCommit(false); ?(' wn<
2、执行一系列sql语句 GfxZ'VIn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close fa
jGZyd0:
Statement sm ; :KSV4>X[%a
sm = cn.createStatement(insert into user...); rKe2/4>0X
sm.executeUpdate(); fy>{QC\
sm.close(); aD<A.Lhy
sm = cn.createStatement("insert into corp...); QUwd [
sm.executeUpdate(); y|C(X
sm.close(); qTRsZz@
3、提交 ,8S/t+H
cn.commit(); -/wtI
4、如果发生异常,那么回滚 tVYF{3BhA
cn.rollback();