java 数据库基本操作 7S'3U}Y>VX
1、java数据库操作基本流程 &b~if}vcb
2、几个常用的重要技巧: *>"k/XUn$
可滚动、更新的记录集 a8$gXX-2
批量更新 R{N9'2l:
事务处理 w=Cqv~
`q":i>FP2
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 C5k\RS9
1、取得数据库连接 1VRexp
1)用DriverManager取数据库连接 />FgDIO
例子 Bg3`w__l;
String className,url,uid,pwd; ,j^z];
className = "oracle.jdbc.driver.OracleDriver"; <B"M} Y>_P
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; N3 O~_=/v?
uid = "system"; UM[<v9NWE
pwd = "manager"; 0{0BL@H
Class.forName(className); %z9eVkPI~
Connection cn = DriverManager.getConnection(url,uid,pwd); ?7n(6kmj4Q
2)用jndi(java的命名和目录服务)方式 (?[^##03MN
例子 E6
glR
String jndi = "jdbc/db"; H!uB&qY
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4Og&w]
DataSource ds = (DataSource) ctx.lookup(jndi); )3 C~kmN7
Connection cn = ds.getConnection(); 'Ll,HgU;
多用于jsp中 6h8fzqRzc
2、执行sql语句 L&*/s&>b
1)用Statement来执行sql语句 sA!,)'6
String sql; [
QHSCF5
Statement sm = cn.createStatement(); kta`[%KmIZ
sm.executeQuery(sql); // 执行数据查询语句(select) oz54IO
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8}5dyn{cvE
2)用PreparedStatement来执行sql语句 ciQG.]
String sql; "j(?fVx
sql = "insert into user (id,name) values (?,?)"; r0 mXRZC
PreparedStatement ps = cn.prepareStatement(sql); vbXZ Z
ps.setInt(1,xxx); +*Um:}&
ps.setString(2,xxx); Jng,:$sZ
... ctqXzM `
ResultSet rs = ps.executeQuery(); // 查询 _hK83s4
int c = ps.executeUpdate(); // 更新 U2~7qC,!Do
#a :W
3、处理执行结果 Nhq&Sn2
查询语句,返回记录集ResultSet gA`x-`
更新语句,返回数字,表示该更新影响的记录数 N^u,C$zP9C
ResultSet的方法 IYb%f T
1、next(),将游标往后移动一行,如果成功返回true;否则返回false <|,0%bq)|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8
oK;Tzh
+vR$%
4、释放连接 aVI%FycYo
cn.close(); `/+%mKlC|[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2`|1 !x
}\p>h
可滚动、更新的记录集 \Pv_5LAo
1、创建可滚动、更新的Statement ^7cZ9/3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Ws_RS%
该Statement取得的ResultSet就是可滚动的 @%8Xa7+
2、创建PreparedStatement时指定参数 o'9K8q\1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); kB`t_`7f
ResultSet.absolute(9000); P[|FK(l
批量更新 ^g[,}t:/d
1、Statement u2p5*gzZ
Statement sm = cn.createStatement(); ~[E@P1
sm.addBatch(sql1); O^tH43C
sm.addBatch(sql2); "!\O N)l*
... 86.LkwlqoH
sm.executeBatch() xUp[)B6?:
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 D'dE!CAUs
2、PreparedStatement W6=j^nv
PreparedStatement ps = cn.preparedStatement(sql); QEUr+7[
{ mQVc ZV
ps.setXXX(1,xxx); z%
ln}
... ML6V,-KU
ps.addBatch(); v&.`^O3W
} >O7ITy
ps.executeBatch(); ]{`
8C
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 In%K
8UAbTqB-
事务的处理 ulc m
1、关闭Connection的自动提交 X<6Ro
es2
cn.setAutoCommit(false); Mo4#UV
2、执行一系列sql语句 <ZF,3~v?
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close F0cde
Statement sm ; %TO=]>q
sm = cn.createStatement(insert into user...); %D::$,;<<
sm.executeUpdate(); ^iWcuh_n
sm.close(); }8+rrzMUB
sm = cn.createStatement("insert into corp...); ,d^ze =
sm.executeUpdate(); &3jq'@6
sm.close(); [gZz'q&[)
3、提交 hWzjn5w3
cn.commit(); .kv/db
4、如果发生异常,那么回滚 $}{u6*u.,
cn.rollback();