java 数据库基本操作 6!Ji>h.Ak
1、java数据库操作基本流程 O<d?'{
2、几个常用的重要技巧: ZR q}g:
可滚动、更新的记录集 e}O -I
批量更新 NF\^'W@N
事务处理 UE`4$^qs
M>H^<N}'A
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 0)Xue9AS
1、取得数据库连接 cLko
1)用DriverManager取数据库连接 'SD|ObBY
例子 Y <i}"eI*
String className,url,uid,pwd; -MW(={#
className = "oracle.jdbc.driver.OracleDriver"; Y./}zCT
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; RdVis|7o
uid = "system"; K\E]X\:
pwd = "manager"; 4C9"Q,o%&
Class.forName(className); R6@~
Connection cn = DriverManager.getConnection(url,uid,pwd); a~eLkWnh<k
2)用jndi(java的命名和目录服务)方式 @?cXa: tX
例子 b=
ec?n #7
String jndi = "jdbc/db"; 6M vRR
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 7
} MJK)
DataSource ds = (DataSource) ctx.lookup(jndi);
X-r,>o:
Connection cn = ds.getConnection(); !#4HGjPI
多用于jsp中 yY-t4WeXP
2、执行sql语句 =qR7-Q8B
1)用Statement来执行sql语句 DHNii_w4v
String sql; lGHu@(n<
Statement sm = cn.createStatement(); {ugKv?e;
sm.executeQuery(sql); // 执行数据查询语句(select) *9{Wn7pck/
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %TTL^@1!b
2)用PreparedStatement来执行sql语句 {*Wwu
f.
String sql; )I-?zyL
sql = "insert into user (id,name) values (?,?)"; oS|~\,p"
PreparedStatement ps = cn.prepareStatement(sql); [tK:y[nk
ps.setInt(1,xxx); 6V6g{6W,/
ps.setString(2,xxx);
83,1d*`
... #\S$$gP
ResultSet rs = ps.executeQuery(); // 查询 Q;,3W+(
int c = ps.executeUpdate(); // 更新 70*iJ^|
U
<$xp
3、处理执行结果 nV xMo_
查询语句,返回记录集ResultSet ^8*SCM_A
更新语句,返回数字,表示该更新影响的记录数 s!fY^3
ResultSet的方法 'xXqEwi4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false w|FVqX
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 QOy&!6
F`V[G(f+r
4、释放连接 wp GnS
cn.close(); Rf0\CEc
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection JEF7hJz~
YM*6W?
可滚动、更新的记录集 '2J6%Gg
1、创建可滚动、更新的Statement QV7c9)<]'}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); o@` E.4
该Statement取得的ResultSet就是可滚动的 _@;3$eB
2、创建PreparedStatement时指定参数 '{k Nbx51
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); YeVc,B'
ResultSet.absolute(9000); ~
2oP,
批量更新
:ItW|
1、Statement 2bxMIr
Statement sm = cn.createStatement(); G$`4.,g
sm.addBatch(sql1); uW'4
Kt
sm.addBatch(sql2); QuRg(K%:
... ^(JbJ@m/
sm.executeBatch() F j('l
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 jz7ltoP
2、PreparedStatement <Jrb"H[T"
PreparedStatement ps = cn.preparedStatement(sql); u#,'ys
{ w:xKgng=L
ps.setXXX(1,xxx); sP8&p*TJF
... yrNc[kS/
ps.addBatch(); f\r4[gU@
} Zt0%E<C{
ps.executeBatch(); :;Rt#!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 M`fXH 3D
/lQ0`^yB
事务的处理 v/+}FS=
1、关闭Connection的自动提交 2(J tD
cn.setAutoCommit(false); VEKITBs
2、执行一系列sql语句 :k/U7 2
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6 |qvo+%
Statement sm ; gOmyFHv.
sm = cn.createStatement(insert into user...); et}Y4,:
sm.executeUpdate(); \'=}kk`
sm.close(); Tv)y}
sm = cn.createStatement("insert into corp...); g*.(!
!
sm.executeUpdate(); m_I$"ge
sm.close(); d;:&3r|X
3、提交 lBZ*G
cn.commit(); nGgc~E$j
4、如果发生异常,那么回滚 A1}+j-D7!y
cn.rollback();