java 数据库基本操作 $y`|zK|G-
1、java数据库操作基本流程 sGzd c
2、几个常用的重要技巧: pM4 j=F
可滚动、更新的记录集 2/h Mx-
批量更新 inhb> zB
事务处理 TX 12$p\
6bU/IVP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )"q2DjfX*
1、取得数据库连接 :1AOund
1)用DriverManager取数据库连接 ^91k@MC
例子 L6',s4
String className,url,uid,pwd; z? cRsqf
className = "oracle.jdbc.driver.OracleDriver"; }]f)Fz
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .&L#%C
uid = "system"; 0tl
pwd = "manager"; *ZY{^f
Class.forName(className); 3<Cd>o.
Connection cn = DriverManager.getConnection(url,uid,pwd); M.t5,NJ
2)用jndi(java的命名和目录服务)方式 c[Y7tj%y
例子 O[-wm;_(=*
String jndi = "jdbc/db"; H p1cVs
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); T$'Ja'9Kj
DataSource ds = (DataSource) ctx.lookup(jndi); R(hqBa/V
Connection cn = ds.getConnection(); 1 iE
多用于jsp中 lv{Qn~\y&
2、执行sql语句 z[7U>q[E
1)用Statement来执行sql语句 8_ju.h[
String sql; 8rw;Yo<k
Statement sm = cn.createStatement(); Kp!P/Q{
sm.executeQuery(sql); // 执行数据查询语句(select) *WOA",gZ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Ot(EDa9}IJ
2)用PreparedStatement来执行sql语句 o{:D
String sql; !iZ*Z Pu
sql = "insert into user (id,name) values (?,?)"; *%g*Np_P
PreparedStatement ps = cn.prepareStatement(sql); '1bdBx\<.
ps.setInt(1,xxx); &&tQ,5H5
ps.setString(2,xxx); R*QL6t
... IU3OI:uq
ResultSet rs = ps.executeQuery(); // 查询 rYc?y
int c = ps.executeUpdate(); // 更新 lKe aI
o6svSS
3、处理执行结果 U-|gtND
查询语句,返回记录集ResultSet Yr[1-Oy/k
更新语句,返回数字,表示该更新影响的记录数 t6j(9[gGq
ResultSet的方法 "ua/65cq9
1、next(),将游标往后移动一行,如果成功返回true;否则返回false D?9=q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 K34y3i_
& {B,m%G
4、释放连接 )0/DY
cn.close(); fv)-o&Q#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection B<_T"n'#b
9B<y w.
可滚动、更新的记录集 RJ@d_~%U
1、创建可滚动、更新的Statement DGp'Xx_8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 4(o0I~hpB?
该Statement取得的ResultSet就是可滚动的 ;)UZT^f`)K
2、创建PreparedStatement时指定参数 M a_! 1Y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2)mKcUL-
ResultSet.absolute(9000); ^2Op?J
批量更新 )D(XDN
1、Statement AEEy49e
Statement sm = cn.createStatement(); |f`!{=?
sm.addBatch(sql1); As78yfK
sm.addBatch(sql2); pcL02W|J
... G!%1<SLi.
sm.executeBatch() vsLn@k3
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /I: d<A
2、PreparedStatement ~!Onz wmO
PreparedStatement ps = cn.preparedStatement(sql); ^${-^w@,%V
{ 011 _(v
ps.setXXX(1,xxx); O4(
Z%YBe
... <y~`J`-
ps.addBatch(); Lt=#tu&d
} Cm>8r5LG
ps.executeBatch(); U<o,`y[Tn
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 00<iv"8
,]Hn*\@p[c
事务的处理 TB1 1crE
1、关闭Connection的自动提交 Hn:%(Rg=aW
cn.setAutoCommit(false); pH)V:BmJ
2、执行一系列sql语句 8`'_ckIgr
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |1;0q<Ka
Statement sm ; 1G$kO90
sm = cn.createStatement(insert into user...); 6rdm=8WFA
sm.executeUpdate(); }LQ&AIRN
sm.close(); .rax`@\8
sm = cn.createStatement("insert into corp...); \'j%q\Bl;
sm.executeUpdate(); llQDZ}T
sm.close(); kg+"Ta[9
3、提交 ]Kil/Y
cn.commit(); H6*F?a`)I
4、如果发生异常,那么回滚 `W{Ye=|[d#
cn.rollback();