java 数据库基本操作 vDj;>VE2b
1、java数据库操作基本流程 cNK)5-
U
2、几个常用的重要技巧: PR7f(NC
可滚动、更新的记录集 ixfdO\nU
批量更新 Y}G_Z#- !
事务处理 ~f>2U]F>5
y0bq;(~X~
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 $K}DB N; 4
1、取得数据库连接
U^lW@u?:
1)用DriverManager取数据库连接 F3U` ueP
例子 %ati7{2!
String className,url,uid,pwd; A&5:ATQ/|
className = "oracle.jdbc.driver.OracleDriver"; 5N7H{vT_
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; D/(CU#i"
uid = "system"; *#U+qgA;`
pwd = "manager"; _c(4o:
Class.forName(className); f{#j6wZM
Connection cn = DriverManager.getConnection(url,uid,pwd); Gctsp2ndW
2)用jndi(java的命名和目录服务)方式 yx{3J
例子 ;T +pu>)
String jndi = "jdbc/db"; .3qu9eP
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); M" lg%j
DataSource ds = (DataSource) ctx.lookup(jndi); Z=S>0|`R
Connection cn = ds.getConnection(); ;az5ZsvN
D
多用于jsp中 F_3:bX
2、执行sql语句 ?Ke
eHMu
1)用Statement来执行sql语句 wEW4gz{s
String sql; csZc|kDI
Statement sm = cn.createStatement(); <W)u{KS#TY
sm.executeQuery(sql); // 执行数据查询语句(select) A=5epsB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); q%YV$$c
2)用PreparedStatement来执行sql语句 R,2P3lv1v@
String sql; nR;D#"p%
sql = "insert into user (id,name) values (?,?)"; Ddju~510
PreparedStatement ps = cn.prepareStatement(sql); 25y6a|`
ps.setInt(1,xxx); Ucw yxXI
ps.setString(2,xxx); _Xcn
N:Rt
... `YBkF
ResultSet rs = ps.executeQuery(); // 查询 Y4.Eq+$gh
int c = ps.executeUpdate(); // 更新 GwU?wIIj^
9O*_L:4o
3、处理执行结果 8|?LN8rp
查询语句,返回记录集ResultSet &^&zR(o`
更新语句,返回数字,表示该更新影响的记录数 +UN <Zp7I/
ResultSet的方法 ,3i,P(?(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Y.#:HRtgW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 p,g1eb|E
p>=[-(mt
4、释放连接 ,"0)6=AE
cn.close(); >gll-&;t
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection nz.{P@[Qk
^D^JzEy'?C
可滚动、更新的记录集 revF;l6->C
1、创建可滚动、更新的Statement %^.%OCX:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); yL4 T
该Statement取得的ResultSet就是可滚动的 |R/.r_x,V?
2、创建PreparedStatement时指定参数 d)o!5L
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Ck =;1sGh
ResultSet.absolute(9000); B$Z3+$hfF
批量更新 P,DC 7\
1、Statement T'-FV
Statement sm = cn.createStatement(); "t=hzn"~%
sm.addBatch(sql1); Joe_PS
sm.addBatch(sql2); :G w~7v_
... >ydRSr^
sm.executeBatch() hg@}@Wq\)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3voT^o
2、PreparedStatement d&8 APe
PreparedStatement ps = cn.preparedStatement(sql); V&]DzjT/
{ t+r:"bb
ps.setXXX(1,xxx); va|*c22;|
... Q?t^@
ps.addBatch(); 2I1uX&g
} =QJRMF
ps.executeBatch(); DaH Z{T8>d
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 CI:^\-z
o KD/rI
事务的处理 s
MN*RKer
1、关闭Connection的自动提交 Lw7=+h)
cn.setAutoCommit(false); &ZHC-qMRK
2、执行一系列sql语句 )}%O>%
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close AdZ;j6#
Statement sm ; gwd (N
sm = cn.createStatement(insert into user...); rx"s!y{!-
sm.executeUpdate(); RR;AJ8wd
sm.close(); `i
+g{kE2M
sm = cn.createStatement("insert into corp...); ysIh[1E~%:
sm.executeUpdate(); s^OO^%b
sm.close(); n(nBRCG)o
3、提交 Y<"7x#AB!
cn.commit(); cV{%^0?D
4、如果发生异常,那么回滚 5v)(8|.M
cn.rollback();