java 数据库基本操作 B@"SOX
1、java数据库操作基本流程 (^DLCP#*
2、几个常用的重要技巧: ~),;QQ,
可滚动、更新的记录集 ;gxN@%}@
批量更新 08Pt(kzNA
事务处理 QD.zU/F~>
Ism^hyL
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 2Y E;m&
1、取得数据库连接 PwFQ #Z
1)用DriverManager取数据库连接 6?3/Ul}
例子 3~[`[4n^
String className,url,uid,pwd; ^eTDD
className = "oracle.jdbc.driver.OracleDriver"; L,Ao.?j
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; sorSyuGr
uid = "system"; 0`VD!_`
pwd = "manager"; 3W7;f!
Class.forName(className); `y8
?=
Connection cn = DriverManager.getConnection(url,uid,pwd); 8iMF 8\
2)用jndi(java的命名和目录服务)方式 Vl5SL{+D
例子 lv<iJH\
String jndi = "jdbc/db"; 0[n c7)sW
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); N5pinR5 H
DataSource ds = (DataSource) ctx.lookup(jndi);
'O.+6`&
Connection cn = ds.getConnection(); zAeGkP ~K
多用于jsp中 G0_&gx`
2、执行sql语句 ,N;))3
1)用Statement来执行sql语句 CCbkxHMf|!
String sql; "C_T]%'Wm
Statement sm = cn.createStatement(); 1% $d D2
sm.executeQuery(sql); // 执行数据查询语句(select)
8q]J;T
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;]2x
2)用PreparedStatement来执行sql语句 ;j>*;Q`
String sql; u]
F70C^~
sql = "insert into user (id,name) values (?,?)"; [<]Y+33
PreparedStatement ps = cn.prepareStatement(sql); L8K0^~Mk
ps.setInt(1,xxx); cvZni#o2)
ps.setString(2,xxx); jrIA]K6
... VK @$JwdL
ResultSet rs = ps.executeQuery(); // 查询 Hze-Ob8
int c = ps.executeUpdate(); // 更新 c u\ls^
Hu<p?mF#
3、处理执行结果 c5X`_
查询语句,返回记录集ResultSet E|pk.
更新语句,返回数字,表示该更新影响的记录数 1|o$X
ResultSet的方法 .CVUEK@Z4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Up<~0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 jr9&.8%W:v
Wm<z?.lS
4、释放连接 =kd YN5R
cn.close(); 1s Br.+p
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
KR&s?
HV ;;
可滚动、更新的记录集 .
3GnZR,L
1、创建可滚动、更新的Statement *i`v~>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); %moJF1
该Statement取得的ResultSet就是可滚动的 rFhW^fP/
2、创建PreparedStatement时指定参数 8O;Vl
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); w|=gSC-o
ResultSet.absolute(9000); BEln6zj
批量更新 I[ai:
1、Statement Yy]T
J
Statement sm = cn.createStatement(); [_h%F,_ A
sm.addBatch(sql1); lj)f4zu
sm.addBatch(sql2); w TlGJ$D0
... 2A*/C7
sm.executeBatch() p"KU7-BfvC
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 UV4u.7y
2、PreparedStatement ~uB'3`x
PreparedStatement ps = cn.preparedStatement(sql); eK9TAW
{ )!cI|tovs
ps.setXXX(1,xxx); hm3jpWi8
... kBbl+1{H
ps.addBatch(); ^;zWWg/d
} 6^sHgYR
ps.executeBatch(); z5 Bi=~=#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :7\9xH
1i
u =Y
事务的处理 R*yU<9Mm8
1、关闭Connection的自动提交 ^/*KNnAWp
cn.setAutoCommit(false); H>.B99vp
2、执行一系列sql语句 =<{ RX8
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "x&3Z@q7
Statement sm ; -l
"U"U"F
sm = cn.createStatement(insert into user...); W
(`c
sm.executeUpdate(); M-Y0xWs
sm.close(); ?>V6P_r>
sm = cn.createStatement("insert into corp...); O%-h&C3
sm.executeUpdate(); ^uW%v2
sm.close(); (;}tf~~r
3、提交 /BpxKh2p
cn.commit(); m"4B!S&Fc(
4、如果发生异常,那么回滚
-4flV D
cn.rollback();