java 数据库基本操作 2_CJV
1、java数据库操作基本流程 lJdwbuB6
2、几个常用的重要技巧: xF7q9'/F
可滚动、更新的记录集 E2( {[J
批量更新 >f-*D25f%
事务处理 7|^5E*8/
1Gh3o}z
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 f/tJ>^N5
1、取得数据库连接 J:G~9~V^
1)用DriverManager取数据库连接 "cx#6Bo|
例子
:qrCqFl
String className,url,uid,pwd; m
4V0e~]
className = "oracle.jdbc.driver.OracleDriver"; VTs
,Ln!,U
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; UCI !>G
uid = "system"; w/Y6m.i1
pwd = "manager"; @{o3NR_
Class.forName(className); =6< Am
Connection cn = DriverManager.getConnection(url,uid,pwd); t[HA86X
2)用jndi(java的命名和目录服务)方式 %C~LKs5oH
例子 k/.a
yLq
String jndi = "jdbc/db"; R d>PE=u
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); V^qkHm e
DataSource ds = (DataSource) ctx.lookup(jndi); a:}&v^v
Connection cn = ds.getConnection(); d>}R3T
多用于jsp中 Q}kXxud
2、执行sql语句 g<jgR*TE`
1)用Statement来执行sql语句 O`D,> =[
String sql; 92=huV
Statement sm = cn.createStatement(); b";D*\=x
sm.executeQuery(sql); // 执行数据查询语句(select) !y-,r4\@`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~v^I*/uY
2)用PreparedStatement来执行sql语句 BM_Rlcx~
String sql; wSIfqf+y
sql = "insert into user (id,name) values (?,?)"; >SaT?k1E
PreparedStatement ps = cn.prepareStatement(sql); %G/j+Pf
ps.setInt(1,xxx); ,,CheRO
ps.setString(2,xxx);
&b!|Y
... 2pV@CT
ResultSet rs = ps.executeQuery(); // 查询 ]2@g 5H}M
int c = ps.executeUpdate(); // 更新 3p#BEH<re
tP0!TkTo9
3、处理执行结果
hp!. P1b
查询语句,返回记录集ResultSet e2vLUlL8
更新语句,返回数字,表示该更新影响的记录数 @V71%D8{
ResultSet的方法 #/2W RN1L
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Bxs0m]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6}^6+@LG
uH=^ILN.
4、释放连接 uM74X^U
cn.close(); MH h;>tw
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection rLJjK$_x
'o% .Qx
可滚动、更新的记录集 b,o@m
1、创建可滚动、更新的Statement JmJNq$2#c
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); xI,7ld~
该Statement取得的ResultSet就是可滚动的 ^K`Vqo
2、创建PreparedStatement时指定参数 KdU&q+C^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); @zAav>
ResultSet.absolute(9000); K %Qj<{)
批量更新 : ?J0e4.]
1、Statement ,e!9WKJ
B
Statement sm = cn.createStatement(); {aVL3QU
sm.addBatch(sql1); k!=
jO#)Rd
sm.addBatch(sql2); 5#hsy;q;[
... jgd^{!
sm.executeBatch() 2kV{|`1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 H*V Z&{\7
2、PreparedStatement ns`njx}C
PreparedStatement ps = cn.preparedStatement(sql); <OA[u-ph%S
{ e'L$g-;>4b
ps.setXXX(1,xxx); +RN|ZG&
... ddG5g
ps.addBatch(); VMgO1-F
} 3,$G?auW
ps.executeBatch(); 04P!l
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3Q_L6Wj~
'?j,oRz^T
事务的处理 ,G%?}TfC)
1、关闭Connection的自动提交 -:NFF'
cn.setAutoCommit(false); |"o/GUI~
2、执行一系列sql语句 Ld$e -dB
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close x9B5@2J1
Statement sm ; J4>k9~q
sm = cn.createStatement(insert into user...); &HIG776
sm.executeUpdate(); GK\`8xWE
sm.close(); +u]L#].;
sm = cn.createStatement("insert into corp...); HVkq{W|w
sm.executeUpdate(); #(f- cK
sm.close(); @-H D9h
3、提交 SRBQ"X[M2
cn.commit(); `8<h aU
4、如果发生异常,那么回滚 usz H1@g'
cn.rollback();