java 数据库基本操作 ry=[:\Z~
1、java数据库操作基本流程 J!qEj{
2、几个常用的重要技巧: lIT2 AFX+
可滚动、更新的记录集
rs
KE
批量更新 %x)U8
事务处理 ~wV98u-N
5 BG&r*U
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 G5@@m-
1、取得数据库连接 JC-yiORVr
1)用DriverManager取数据库连接 O?<_,-.
例子 trA `l/
String className,url,uid,pwd; T</gWW
className = "oracle.jdbc.driver.OracleDriver"; l`G:@}P>G
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; r/w@Dh]{_
uid = "system"; p_y*-,W
(
pwd = "manager"; Y\2>y"8>$x
Class.forName(className); lP
&%5y;
Connection cn = DriverManager.getConnection(url,uid,pwd); $e,!fB;B
2)用jndi(java的命名和目录服务)方式 57%cN-v*
例子 W..>Ny;'3
String jndi = "jdbc/db"; gI$`d?[0{
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0L-g'^nn
DataSource ds = (DataSource) ctx.lookup(jndi); MA QY/s~F
Connection cn = ds.getConnection(); */qc%!YV9
多用于jsp中 xL#oP0d<e
2、执行sql语句 LA3,e (e
1)用Statement来执行sql语句 eJdQ7g[>
String sql; %&S]cEw
Statement sm = cn.createStatement(); iC\=U
sm.executeQuery(sql); // 执行数据查询语句(select) ~H."{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); *)sz]g|d
2)用PreparedStatement来执行sql语句 f;6d/?= ~
String sql; agot
(
sql = "insert into user (id,name) values (?,?)"; ImW~Jy
PreparedStatement ps = cn.prepareStatement(sql); _Xe< JJvq
ps.setInt(1,xxx); rkXSygb
ps.setString(2,xxx); EnAw8Gm*
...
$VNn`0^gF
ResultSet rs = ps.executeQuery(); // 查询 6XqO'G
int c = ps.executeUpdate(); // 更新 IKj1{nZvDc
'KrkCA
3、处理执行结果 ~UFsi VpL
查询语句,返回记录集ResultSet Qc/J"<Lx
更新语句,返回数字,表示该更新影响的记录数 [^P2Kn
ResultSet的方法 <o`]wOrl
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "6h.6_bTw
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~Dh}E9E:
uQ)]g
4、释放连接 _JB3+0@
cn.close(); bsDUFXH]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection XAkl,Y
A>S2BL#=
可滚动、更新的记录集 2sq<"TlQXI
1、创建可滚动、更新的Statement M6n.uho/
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); =-Tetp
该Statement取得的ResultSet就是可滚动的 < ,n4|z)
2、创建PreparedStatement时指定参数 Ue%5
:Sdr
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ,]'!2?
ResultSet.absolute(9000); #{PNdINoU
批量更新 8=VX` X
1、Statement \|s/_35(
Statement sm = cn.createStatement(); bBL"F!.
sm.addBatch(sql1); H%V[%
T4=
sm.addBatch(sql2); =25"qJr
... m\Nc}P_"p
sm.executeBatch() 1NJ|%+I
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 21Opx~T3
2、PreparedStatement v.J#d>tvf
PreparedStatement ps = cn.preparedStatement(sql); T9yW# .
{ UNHHzTsr?
ps.setXXX(1,xxx);
CQHlSV W
... ~{{:-XkVB
ps.addBatch(); \v_(*
} (6b%;2k
ps.executeBatch(); C7:Ry)8'I
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 '-_PO|}
[0emOS
事务的处理 "a7d`l:
1、关闭Connection的自动提交 4B
6Aw?
cn.setAutoCommit(false); ce\-oT
2、执行一系列sql语句 &,xM;8b
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Ek6W:Q:@
Statement sm ; ~heF0C_
sm = cn.createStatement(insert into user...); Uyh#g^r
sm.executeUpdate(); jrR~V* :k
sm.close(); g*uO
IF
sm = cn.createStatement("insert into corp...); *G4;
sm.executeUpdate(); ZVL0S{V-mh
sm.close(); .N 2Yxty8>
3、提交 !ywc). ]e
cn.commit(); |iI`p-L9
4、如果发生异常,那么回滚 TMrmyvv
cn.rollback();