java 数据库基本操作 OYQXi
1、java数据库操作基本流程 3W%f#d$`
2、几个常用的重要技巧: A}
x_zt
可滚动、更新的记录集 |8&\N
批量更新 >F_qa=t%[
事务处理 g>d7%FFn}
1oXz[V
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 YqK+F=0
1、取得数据库连接 -P IA;#Gs
1)用DriverManager取数据库连接 BLsdx}
例子 (xjoRbU*
String className,url,uid,pwd; Fv5x6a
className = "oracle.jdbc.driver.OracleDriver"; )M&I)In'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *B)Jv9
uid = "system"; U4
go8
pwd = "manager"; tIc0S!H#
Class.forName(className); GF$rPY[
Connection cn = DriverManager.getConnection(url,uid,pwd); ;C7BoHB9
2)用jndi(java的命名和目录服务)方式 Rh05W_?Js
例子 2^k^"<h5j
String jndi = "jdbc/db"; Dohl,d
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); jpPdjQ
DataSource ds = (DataSource) ctx.lookup(jndi); oho AUT
Connection cn = ds.getConnection(); S|O%h}AH;
多用于jsp中 *Xf[b)FR
2、执行sql语句 QSl:=Q'
1)用Statement来执行sql语句 _>Pe]3
String sql; c,{&
Statement sm = cn.createStatement(); sM);gI14
sm.executeQuery(sql); // 执行数据查询语句(select) 3> n2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); pGZl.OI
2)用PreparedStatement来执行sql语句 |e.3FjTH
String sql; T7WZ(y
3C
sql = "insert into user (id,name) values (?,?)"; GA%"w=M\
PreparedStatement ps = cn.prepareStatement(sql); Azdz3/
ps.setInt(1,xxx); P|!/mu]
ps.setString(2,xxx); OXa5Jg}=
... 4jq`No_
ResultSet rs = ps.executeQuery(); // 查询 \ _-kOS
int c = ps.executeUpdate(); // 更新 CrQA :_Z(7
2\$WP-)%
3、处理执行结果 l>[QrRXiSN
查询语句,返回记录集ResultSet ouu-wQ|(mM
更新语句,返回数字,表示该更新影响的记录数 :_I
wc=
ResultSet的方法 a{%52B"
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &)fhlp5
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 d=c1WK
P_^|KEz
4、释放连接 /S2p ``E+
cn.close(); ~Q{[fy=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection !)l%EJngL
6@ (k8<3
可滚动、更新的记录集 nEZ-h7lzl(
1、创建可滚动、更新的Statement q:D0$YY0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); o q'J*6r
该Statement取得的ResultSet就是可滚动的 )U/@J+{{
2、创建PreparedStatement时指定参数 fjz2m
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); m`1}O"<&i
ResultSet.absolute(9000); }.Na{]<gh
批量更新 C7c|\ T
1、Statement oto
wvm
Statement sm = cn.createStatement(); zwniS6R1
sm.addBatch(sql1); k8t Na@H
sm.addBatch(sql2); 0W<nE[U
... hD9'`SQ
sm.executeBatch() X&;]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $
uIwRG
<
2、PreparedStatement pyb}ha
PreparedStatement ps = cn.preparedStatement(sql); I,`D&
{ h9)]N&07b
ps.setXXX(1,xxx); 2Xq!'NrS
... x:&L?eOT
ps.addBatch(); tp,mw24
} "*H'bzK
ps.executeBatch(); a_}BTkfHa
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 T/spUlWu
9DP75 ti
事务的处理 wYS
KtG~/S
1、关闭Connection的自动提交 "YdDaj</
cn.setAutoCommit(false); |WwFE|<
2、执行一系列sql语句 dBD4ogo1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close \qK}(xq[
Statement sm ; Ws}kb@5
sm = cn.createStatement(insert into user...); 8d*<Aki?;
sm.executeUpdate(); KWuj_.;
sm.close(); xa%ktn
sm = cn.createStatement("insert into corp...); {bq-: CZe
sm.executeUpdate(); j}x
O34
sm.close(); e>i8 =U`;
3、提交 {1-CfQ0
8
cn.commit(); =QxE-)v
4、如果发生异常,那么回滚 +h\W~muR
cn.rollback();