java 数据库基本操作 F |^tRL-
1、java数据库操作基本流程 thrv_^A
2、几个常用的重要技巧: y.+!+4Mg|
可滚动、更新的记录集 vd#BT$d?
批量更新 GRj#1OqL
事务处理 B
f"L;L
MHF7hk ps}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [6cf$FS9
1、取得数据库连接 gib'f@i ;
1)用DriverManager取数据库连接 .BrYz:#A
例子 9M Ug/
String className,url,uid,pwd; B> V)6\
className = "oracle.jdbc.driver.OracleDriver"; 9
gWqs'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; /j;HM[
uid = "system"; pfF2!`7pI
pwd = "manager"; NZ:KJ8ea"
Class.forName(className); 4'G osQ85
Connection cn = DriverManager.getConnection(url,uid,pwd); %WAaoR&u
2)用jndi(java的命名和目录服务)方式 E4qQ
例子 [VY265)g
String jndi = "jdbc/db"; yLEAbd%+
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )UN_,'H/V
DataSource ds = (DataSource) ctx.lookup(jndi); "eZ~]m}L0
Connection cn = ds.getConnection(); @\|Fd)
多用于jsp中 G}#p4\/
2、执行sql语句 VX]Ud\(
1)用Statement来执行sql语句 KSxZ4Y
String sql; a&%v ^r[
Statement sm = cn.createStatement(); 33OkYC%e
sm.executeQuery(sql); // 执行数据查询语句(select) fO,m_
OR:)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); gRg8D{
2)用PreparedStatement来执行sql语句 OSIf>1
String sql; Y?xc#'
sql = "insert into user (id,name) values (?,?)"; IyoitIbLl
PreparedStatement ps = cn.prepareStatement(sql); \fJ _,
ps.setInt(1,xxx); Q+; N(\
ps.setString(2,xxx); ~en' E
...
,)Z1&J?
ResultSet rs = ps.executeQuery(); // 查询 2|$G<f
int c = ps.executeUpdate(); // 更新
\JBPZ~N3
. 9@y*_9
3、处理执行结果 I
T gzD"d
查询语句,返回记录集ResultSet (gjCm0#_%
更新语句,返回数字,表示该更新影响的记录数 v{oHC4
ResultSet的方法 2}U:6w
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Hk@LHC
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ?9ScKN
u$ff %`E
4、释放连接 8DcIM(;Z
cn.close(); {"mb)zr
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ie}?}s
As>P(
可滚动、更新的记录集 A+ LX37B
1、创建可滚动、更新的Statement 2!?=I'uMA
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8]&\FA 8
该Statement取得的ResultSet就是可滚动的 I\Pw`
2、创建PreparedStatement时指定参数 <Y+>a#T
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); T~)R,OA7m
ResultSet.absolute(9000); g<^-[w4/
批量更新 s7s@!~
1、Statement jh"YHe/X
Statement sm = cn.createStatement(); Bj*
M
W
sm.addBatch(sql1); !+_X q$9_
sm.addBatch(sql2); ^c?$$Tq
... PZk"!I<oN
sm.executeBatch() gfQ1p ?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %s ">:
2、PreparedStatement b_']S0$c\
PreparedStatement ps = cn.preparedStatement(sql); PE<(eIr
{ J=Hyoz+9
ps.setXXX(1,xxx); ="P&!lu
... RuWu#tk
ps.addBatch(); |vgYi
} _zDf8hy
ps.executeBatch(); %a|m[6+O
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 $PFE>=nM
rT';7>{g
事务的处理 [U_
1、关闭Connection的自动提交 `u$lSGl
cn.setAutoCommit(false); + I4s0
2、执行一系列sql语句 H0-v^H>^
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?xw0kXK4
Statement sm ; Xp0S
sm = cn.createStatement(insert into user...); r=S,/N(1
sm.executeUpdate();
,P^4??' o
sm.close(); U
U@
sm = cn.createStatement("insert into corp...); ahg]OWn#
sm.executeUpdate(); {9-n3j}
sm.close(); 'M,O(utGv
3、提交 qv3% v3\4
cn.commit(); oW3|b2D
4、如果发生异常,那么回滚 i= jYl
cn.rollback();