java 数据库基本操作 vLK\X$4
1、java数据库操作基本流程 >]XaUQ-
2、几个常用的重要技巧: )<x;ra^
可滚动、更新的记录集 X?v^>mA
批量更新 5)>ZO)F&
事务处理 qnk,E-
7ru9dg1?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ZaUcP6[h
1、取得数据库连接 D_19sN@0m
1)用DriverManager取数据库连接 N} x/&e
例子 kG;eOp16R
String className,url,uid,pwd; j#nO6\&o
className = "oracle.jdbc.driver.OracleDriver"; 8T.5Mhx0jS
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #SihedWi
uid = "system"; R!V5-0%
pwd = "manager"; U ygw*+
Class.forName(className); w(e+o.:
Connection cn = DriverManager.getConnection(url,uid,pwd); 2) /k`Na
2)用jndi(java的命名和目录服务)方式 C>`.J_N
例子 9*TS90>a
String jndi = "jdbc/db"; ox\B3U%`p}
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
IB.'4B7
DataSource ds = (DataSource) ctx.lookup(jndi); ofPF}
Connection cn = ds.getConnection(); Nvx)H(8F
多用于jsp中 T?]kF-
2、执行sql语句 #-gGsj;F
1)用Statement来执行sql语句 =4M.QA@lI!
String sql; rPo\Dz
Statement sm = cn.createStatement(); /VmCN]2AZ
sm.executeQuery(sql); // 执行数据查询语句(select) }KaCf,O
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {Z?$Co^R
2)用PreparedStatement来执行sql语句 +.gf]|
String sql; sQ>B_Y!
sql = "insert into user (id,name) values (?,?)"; b!^M}s6
PreparedStatement ps = cn.prepareStatement(sql); RZ<+AX9R
ps.setInt(1,xxx); %+7T9>+
ps.setString(2,xxx); Vr/` \441
... ZXsY-5$#d-
ResultSet rs = ps.executeQuery(); // 查询 JW% /^'
int c = ps.executeUpdate(); // 更新 94'k7_q
)S wG+k,
3、处理执行结果 V$Xl^# tN
查询语句,返回记录集ResultSet uku}Mr"p
更新语句,返回数字,表示该更新影响的记录数 lEyG9Xvi
ResultSet的方法 WK_y1(v>
1、next(),将游标往后移动一行,如果成功返回true;否则返回false GEe 0@q#YA
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 l#5~t|\
B::4Qme
4、释放连接 LpiHoavv
cn.close(); 7$1fy0f[l
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection S`W'G&bCj
a$xeiy9
可滚动、更新的记录集 J2oWssw"
1、创建可滚动、更新的Statement dY4k9p8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); iBtjd`V*
该Statement取得的ResultSet就是可滚动的 +C'TW^
2、创建PreparedStatement时指定参数 >TlW]st
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); bQ^DX `o6P
ResultSet.absolute(9000); q2S!m6 !
批量更新
/.| A
1、Statement [yYH>~SuwZ
Statement sm = cn.createStatement(); :Er^"9'A2
sm.addBatch(sql1); m<FWv2)^
sm.addBatch(sql2); )O2Nlk~l&
... >2| [EZ
sm.executeBatch() ]e@0T{!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 XoKO2<3
2、PreparedStatement )DGz`->
PreparedStatement ps = cn.preparedStatement(sql); k"q!|+&Fs
{ x!"SD3r=4>
ps.setXXX(1,xxx); Bg 7j5
... mX<Fuu}E*Z
ps.addBatch(); AK@`'$
} m{bZRkt
ps.executeBatch(); jSwtf
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Ss#@=:"P
|P,zGy
事务的处理 !^)wPmk
1、关闭Connection的自动提交 `x{.z=xC
cn.setAutoCommit(false); Sc4obcw%
2、执行一系列sql语句 sFQ4O- SM
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close M1/M}~
Statement sm ; MG7 ?N #
sm = cn.createStatement(insert into user...); <fC@KY>#
sm.executeUpdate(); S'
(cqO}=F
sm.close(); ()QOZ+x_!
sm = cn.createStatement("insert into corp...); FGDGWcRw~
sm.executeUpdate(); (B_7\}v|_
sm.close(); "EcX_>
3、提交 |+Hp+9J
cn.commit(); ~Ho{p Oq
4、如果发生异常,那么回滚 %Ycx C0S[
cn.rollback();