java 数据库基本操作 ~Fo2M wE2~
1、java数据库操作基本流程 x(Uv>k~i}
2、几个常用的重要技巧: Pbbi*&i
可滚动、更新的记录集 =3% GLj
批量更新 3%Q<K=jy
事务处理 6&<QjO
,_V/W'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 z@ZI$.w
1、取得数据库连接 J"h2"$v,
1)用DriverManager取数据库连接 N!<l~[rc
例子 pk'd&.
String className,url,uid,pwd; uj\&-9gEi
className = "oracle.jdbc.driver.OracleDriver"; 4VvE(f
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $<=d[6
uid = "system"; 4gEw}WiP
pwd = "manager"; hFtjw6
Class.forName(className); A>Qu`%g*
Connection cn = DriverManager.getConnection(url,uid,pwd); n>B
,O
2)用jndi(java的命名和目录服务)方式 ?Qd`Vlp7
例子 6b2h\+AP
String jndi = "jdbc/db"; !S7?:MJ?p\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); OXZK|C;M}
DataSource ds = (DataSource) ctx.lookup(jndi); *C|*{!
Connection cn = ds.getConnection(); 90F.9rh
多用于jsp中 "+ {2!
2、执行sql语句 ?HOnDw.v1
1)用Statement来执行sql语句 U7/
=|Z
String sql; 'S74Ys=-0
Statement sm = cn.createStatement(); Nf* .r
sm.executeQuery(sql); // 执行数据查询语句(select) CD#U`jf
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); F@ pf._c
2)用PreparedStatement来执行sql语句 #D(=[F
String sql; |;aZi?Ek[
sql = "insert into user (id,name) values (?,?)"; Wn=I[K&&
PreparedStatement ps = cn.prepareStatement(sql); t:oq't
ps.setInt(1,xxx); BINHCZ
ps.setString(2,xxx); Hr]
... FmF[S&gFRs
ResultSet rs = ps.executeQuery(); // 查询 #~m^RoE
int c = ps.executeUpdate(); // 更新 Exv!!0Cd^
~ [/jk !G
3、处理执行结果 WC_U'nTu4
查询语句,返回记录集ResultSet AK'3N1l`
更新语句,返回数字,表示该更新影响的记录数 W:j9 KhvT
ResultSet的方法 F#Pn]
1、next(),将游标往后移动一行,如果成功返回true;否则返回false I5[@C<b
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Je"XIhBr
:qR8 e J
4、释放连接 N|"q6M!ZL
cn.close(); |FaK=e
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection E.N>,N
L`O7-'`
可滚动、更新的记录集 #/9Y}2G|]
1、创建可滚动、更新的Statement ? YIe<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); bx6=LK
该Statement取得的ResultSet就是可滚动的 fpZHE=}r
2、创建PreparedStatement时指定参数 A=ez,87
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #ax% n
ResultSet.absolute(9000); (}T},ygQ
批量更新 |V}tTx1
1、Statement ?qHQ#0 @y]
Statement sm = cn.createStatement(); :KRNLhWb
sm.addBatch(sql1); I_?R(V[9
sm.addBatch(sql2); Rm,>6bQx
... g hkV^ [
sm.executeBatch() h?ijZHG $
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 )FA:wsy~E
2、PreparedStatement FW3E UC)P
PreparedStatement ps = cn.preparedStatement(sql); Xfb-<
Q0A
{ R;U4a2~
ps.setXXX(1,xxx); 2Z"\%ZD
... I3Z\]BI
ps.addBatch(); @3b @]l5
} %/nDG9l
ps.executeBatch(); k $ SMQ6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 v3n
T@ra'
cFjD*r-
事务的处理 zw5Ol%JF
1、关闭Connection的自动提交 (<H@W/0$
cn.setAutoCommit(false); tK+JmbB\
2、执行一系列sql语句 ?hp,h3s;n$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close M0vX9;J
Statement sm ; jgEYlZ
sm = cn.createStatement(insert into user...); 8/P!i2o
sm.executeUpdate(); /UR;,ts
sm.close(); -
?
i
sm = cn.createStatement("insert into corp...); z~2;u5S&
sm.executeUpdate(); PRyzvc~
sm.close(); VggSDb
3、提交 NVom6K
cn.commit(); .k
up[d(
4、如果发生异常,那么回滚 Y)GU{
cn.rollback();