java 数据库基本操作 Ltx eT.
1、java数据库操作基本流程 .FarKW
2、几个常用的重要技巧: l1&NU'WW
可滚动、更新的记录集 ;w/|5 ;{A;
批量更新 7$l! f
事务处理 ._uXK[c7P
"lFS{7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ]}wo$7pO
1、取得数据库连接 pE<@
1)用DriverManager取数据库连接 g8JO/s5xV
例子 <@DF0x!
String className,url,uid,pwd; O]>FNsh !
className = "oracle.jdbc.driver.OracleDriver"; LovVJ^TD0i
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; vnNX)$f
uid = "system"; P9Yw\
pwd = "manager"; 0~(K@U>#
Class.forName(className); {W[OjPC~F
Connection cn = DriverManager.getConnection(url,uid,pwd); 6z6\-45
2)用jndi(java的命名和目录服务)方式 a,GOS:?O5
例子 yl>V'
String jndi = "jdbc/db"; %[<@$qP
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )<?^~"h
DataSource ds = (DataSource) ctx.lookup(jndi); 5d7AE^SHsH
Connection cn = ds.getConnection(); V!Px975P
多用于jsp中 ScgaWJ
2、执行sql语句 xp!MA
1)用Statement来执行sql语句 56;^
NE4
String sql; :6
, `M,
Statement sm = cn.createStatement(); % Rv;e
sm.executeQuery(sql); // 执行数据查询语句(select) e;M#MkP7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8QYP\7}o
2)用PreparedStatement来执行sql语句 J<"=c
z$
String sql; y_>l'{w3^
sql = "insert into user (id,name) values (?,?)"; +[JvpDv%
PreparedStatement ps = cn.prepareStatement(sql); ^/0c`JG!x
ps.setInt(1,xxx); @B@`V F
ps.setString(2,xxx); "Cj{Z@n
... MY8[)<q"
ResultSet rs = ps.executeQuery(); // 查询 <6
HrHw_
int c = ps.executeUpdate(); // 更新 ;i)NP X
'F\@KE-d
3、处理执行结果 5Iql%~_x
查询语句,返回记录集ResultSet ma!rZn
更新语句,返回数字,表示该更新影响的记录数 9hJlc
ResultSet的方法 hu]l{TXi
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ma +iIt;
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 1BA/$8G
Ihd{@6m
4、释放连接 WE-cq1)
cn.close(); s?fO)7ly
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +f}u.T_#
k10g %K4g
可滚动、更新的记录集 6.!aJJLN
1、创建可滚动、更新的Statement V0rS^SAF
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); {
]*#WU
该Statement取得的ResultSet就是可滚动的 :i?7RouO
2、创建PreparedStatement时指定参数
{"RUiL^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 4Bn
<L&@/
ResultSet.absolute(9000); }f
l4^F
批量更新 =t/"&[r
1、Statement rZij[6]Y^
Statement sm = cn.createStatement(); %`4\ 8H`
sm.addBatch(sql1); ;?{N=x8
sm.addBatch(sql2); vKcZgIR
... IL]Js W
sm.executeBatch() #j+0jFu
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8|z@"b l)
2、PreparedStatement lU`}
PreparedStatement ps = cn.preparedStatement(sql); {RmN1'%
{ ;JD/4:
ps.setXXX(1,xxx); ^&!SnM
... m@Q%)sc)
ps.addBatch(); c %jW'
} CeZ+!-lG
ps.executeBatch(); S'h{["P~
0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 q':P9o*N?
=tKb7:KU
事务的处理 &y}
]^wB
1、关闭Connection的自动提交 ^$!H|
cn.setAutoCommit(false); P^)J^{r
2、执行一系列sql语句 dcd9AW=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +Fk]hCL
Statement sm ; {:63% j
sm = cn.createStatement(insert into user...); iI]E%H}
sm.executeUpdate(); I+!?~]AUuq
sm.close(); @VzD>?)
sm = cn.createStatement("insert into corp...); N!{waPbPi
sm.executeUpdate(); ,\DSi&T
sm.close(); <Z>p1S
3、提交 nNEIwlj;
cn.commit(); J7RO*.O&Iq
4、如果发生异常,那么回滚 ![ce=9@t<
cn.rollback();