java 数据库基本操作 c-VIp A1
1、java数据库操作基本流程 `!( IQ&
2、几个常用的重要技巧: ?3
S{>+'
可滚动、更新的记录集 )4#YS$B$@)
批量更新 )JrG`CvdU
事务处理 q-hR EO
\s?8}k
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 jK-b#h.gL
1、取得数据库连接 C'7DG\pr
1)用DriverManager取数据库连接 r'(*#
例子 `92P~Y~`W
String className,url,uid,pwd; c_4K
className = "oracle.jdbc.driver.OracleDriver"; rnyXMt.q
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;rRV=$y
uid = "system"; 38mC+%iC
pwd = "manager"; b#nI#!p'
Class.forName(className); xyD2<?dGUb
Connection cn = DriverManager.getConnection(url,uid,pwd); $c{fPFe-
2)用jndi(java的命名和目录服务)方式 ~ &<Ls
例子 g@2KnzD
String jndi = "jdbc/db"; E1j3c
:2
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); bWgRGJqt
DataSource ds = (DataSource) ctx.lookup(jndi); X5pb9zRq
Connection cn = ds.getConnection(); uG$*DeZti
多用于jsp中 4mHk,Dd9,
2、执行sql语句 $\+x7"pI
1)用Statement来执行sql语句 + 70x0z2
String sql; h+R26lI1x
Statement sm = cn.createStatement(); Xf#+^cQ
sm.executeQuery(sql); // 执行数据查询语句(select)
NDUH10Y:[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9.%t9RM^
2)用PreparedStatement来执行sql语句 1}_4C0h\'
String sql; W)Ct*I^
sql = "insert into user (id,name) values (?,?)"; UgLFU#
PreparedStatement ps = cn.prepareStatement(sql); A.vf)hO
ps.setInt(1,xxx); PI.Zd1r
ps.setString(2,xxx); QWc,JCu
... xa'^:H $X
ResultSet rs = ps.executeQuery(); // 查询 *Z$W"JP
int c = ps.executeUpdate(); // 更新 yJ/YK
~t<G gNI
3、处理执行结果 !bCSt?}@u
查询语句,返回记录集ResultSet j{j5TvsrY
更新语句,返回数字,表示该更新影响的记录数 G?v!Uv8O
ResultSet的方法 .07"I7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Aydpr_lp
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;f~fGsH}e'
%VGW]!QR
4、释放连接 Ld
0*)rI#
cn.close(); Lf)JO|o
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u`ryCZo#g
+%f6{&q$
可滚动、更新的记录集 b"aF-,M>
1、创建可滚动、更新的Statement hFo29oN
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); A`#?Bj
该Statement取得的ResultSet就是可滚动的 eBH:_Ls_-^
2、创建PreparedStatement时指定参数 dF[|9%)
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); hF{gN3v5
ResultSet.absolute(9000); ^RJ@9`P&t
批量更新 * RyU*au
1、Statement le'
Kp
V
Statement sm = cn.createStatement(); OwT _W)$
sm.addBatch(sql1); A=0{}B#
sm.addBatch(sql2); Y7zs)W8xTT
... l$Vy\CfK3n
sm.executeBatch() xL*J9&~iG
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 >$tU @mq
2、PreparedStatement HC=ZcK'W
PreparedStatement ps = cn.preparedStatement(sql); !?>QN'p.b
{ vV xw*\`<6
ps.setXXX(1,xxx); 74ho=
... Q}G2f4
ps.addBatch(); sv!zY= 6
} n5%\FFG0M
ps.executeBatch(); $KQ q~|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 YKz#,
9%Tqk"x?
事务的处理 )Q62 I\
1、关闭Connection的自动提交 BT&R:_:
cn.setAutoCommit(false); gxhdxSm=2
2、执行一系列sql语句 -uxU[E
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close u]Q}jqiq"
Statement sm ; +;\w'dBi,
sm = cn.createStatement(insert into user...); }K={HW1>
sm.executeUpdate(); 'pT13RFD
sm.close(); ? )h8uf4
sm = cn.createStatement("insert into corp...); Yn[>Y)
sm.executeUpdate(); c9G%;U)
sm.close(); (5@H<c^6
3、提交 X0iy
cn.commit(); !uoT8BBAk
4、如果发生异常,那么回滚 oN[}i6^,e
cn.rollback();