java 数据库基本操作 )7k&`?Mh
1、java数据库操作基本流程 RA}U#D:$i
2、几个常用的重要技巧: CJv>/#$/F
可滚动、更新的记录集 k06xz#pL
批量更新 /%5_~Jkr,
事务处理 5cgo)/3M@}
A3z/Bz4]:#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 M5F(<,n;
1、取得数据库连接 u]P03B
1)用DriverManager取数据库连接 -}E)M}W
例子 B~WK)UR
String className,url,uid,pwd; [7'#~[a~
className = "oracle.jdbc.driver.OracleDriver"; #UBB
lE#
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =l_rAj~I|
uid = "system"; 6k:y$,w
pwd = "manager"; c%ZeX%p
Class.forName(className); xC[~Fyhp
Connection cn = DriverManager.getConnection(url,uid,pwd); H_Iim[v#
2)用jndi(java的命名和目录服务)方式 I/Sv"X6E
例子 *}>Bkq9h
String jndi = "jdbc/db"; .N/GfR`0/<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ^p$1D
DataSource ds = (DataSource) ctx.lookup(jndi); <b6s&"%=
Connection cn = ds.getConnection(); |3 ;u"&(P
多用于jsp中 IhUW=1&J
2、执行sql语句 vc )9Re$
1)用Statement来执行sql语句 d [)_sa
String sql; .F4oo =
Statement sm = cn.createStatement(); 6`_! ?u7
sm.executeQuery(sql); // 执行数据查询语句(select) w~4
z@/^"p
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); I<c@uXXV;!
2)用PreparedStatement来执行sql语句 "EN98^
Sl
String sql; aF,jJ}On
sql = "insert into user (id,name) values (?,?)"; zwMQXI'k83
PreparedStatement ps = cn.prepareStatement(sql); ]Mn&76fu
ps.setInt(1,xxx); "fRlEO[9
ps.setString(2,xxx); +d@v
AxP
... j \!~9
ResultSet rs = ps.executeQuery(); // 查询 ylkpYd
int c = ps.executeUpdate(); // 更新 r4 9UJE
MhHr*!N"}
3、处理执行结果 )!N2'Ld
查询语句,返回记录集ResultSet Q.rB\8ea
更新语句,返回数字,表示该更新影响的记录数 W"W@WG9X0
ResultSet的方法 l{nB.m2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;>inT7?3|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ,D:iQDG^
Bh\
[CY
4、释放连接 o~Bk0V=
cn.close(); Z~duJsH
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9+]ZH.(YE
F"-S~I7'L
可滚动、更新的记录集 &6`
1、创建可滚动、更新的Statement 2dv|6p
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 2.^7?ok
该Statement取得的ResultSet就是可滚动的 QV`X?m
2、创建PreparedStatement时指定参数 )o05Vda
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); g ^D)x[
ResultSet.absolute(9000); K.:6YXVs<
批量更新 \%w7D6dEZ
1、Statement 2v"wWap-+
Statement sm = cn.createStatement(); '}wG"0
sm.addBatch(sql1); c80
}1
sm.addBatch(sql2); 1i5 vW- '4
... $
1ak I
sm.executeBatch() B(S5+Y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 j)6@q@P/
2、PreparedStatement e7Yb=/F
PreparedStatement ps = cn.preparedStatement(sql); :GN)7|:
{ R=2
gtW"r
ps.setXXX(1,xxx); Gh>"s #+
... u+%)JhIp
ps.addBatch(); @/_XS4
} d/0/$Bz}P
ps.executeBatch(); Iu=pk@*O
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ==jkp
U*=
6LSPPMM
事务的处理 RM?_15m
1、关闭Connection的自动提交 Ig40#pA
cn.setAutoCommit(false); t9KH|y
2、执行一系列sql语句 G:E+s(x
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close sRkz
WMl
Statement sm ; NTpz)R
sm = cn.createStatement(insert into user...); iqU.a/~y
sm.executeUpdate(); *>}McvtTw
sm.close(); HB/
_O22
sm = cn.createStatement("insert into corp...); "k>{b:R|
sm.executeUpdate(); #Pe\Z/
sm.close(); sg! =Q+
3、提交 Vp- n(Z
cn.commit(); % xH>0
4、如果发生异常,那么回滚 ~2, wI<Nz
cn.rollback();