java 数据库基本操作 )M^
gT}M
1、java数据库操作基本流程 k;W
XB|k
2、几个常用的重要技巧: `H+lPM66
可滚动、更新的记录集 4&iCht
=
批量更新 Z30A{6}
事务处理 "wc<B4"
tl>7^hH
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 IVmo5,&5(
1、取得数据库连接 E(|>Ddv B&
1)用DriverManager取数据库连接 8cQ'dL`(
例子 yh=N@Z*zP
String className,url,uid,pwd; 8b=_Y;
className = "oracle.jdbc.driver.OracleDriver"; 5LMw?P.<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; >-c8q]()ly
uid = "system"; 6H|S;K+
pwd = "manager"; .G\7cZ
Class.forName(className); 3gf1ownC
Connection cn = DriverManager.getConnection(url,uid,pwd); :gC#hmm^
2)用jndi(java的命名和目录服务)方式 b`_Q8 J
例子 Y9|!+,
String jndi = "jdbc/db"; #fM'>$N
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); wyG;8I
DataSource ds = (DataSource) ctx.lookup(jndi); -F>jIgeC2v
Connection cn = ds.getConnection(); :hA#m[
多用于jsp中 y?#
Loe
2、执行sql语句 OrG).^l
1)用Statement来执行sql语句 -{A<.a3P}=
String sql; 2?i7UvV
Statement sm = cn.createStatement(); j| Q-*]V
sm.executeQuery(sql); // 执行数据查询语句(select) %>s|j'{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {XHh8_^&
2)用PreparedStatement来执行sql语句 K+iP6B
String sql; mBC+6(5V
sql = "insert into user (id,name) values (?,?)"; B?wq=DoG
PreparedStatement ps = cn.prepareStatement(sql); /7LR;>B j
ps.setInt(1,xxx); H']+L~j
ps.setString(2,xxx); PRT +mT
... C.QO#b
ResultSet rs = ps.executeQuery(); // 查询 a: K[ y
int c = ps.executeUpdate(); // 更新 "ITIhnE
8$|=P!7EO
3、处理执行结果 _aMF?Pj~m
查询语句,返回记录集ResultSet J-4:H
gx
更新语句,返回数字,表示该更新影响的记录数 {^\r`Vp
ResultSet的方法 y3ikWnx
1、next(),将游标往后移动一行,如果成功返回true;否则返回false A(N4N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9C i-v/M]
Q7A MRrN
4、释放连接 E!AE4B1bd
cn.close(); 5M_H
NWi4
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 07 $o;W@
xwty<?dRW1
可滚动、更新的记录集 |)G<,FJQE_
1、创建可滚动、更新的Statement (tQc
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); RFH0
该Statement取得的ResultSet就是可滚动的 {BHO/q3
2、创建PreparedStatement时指定参数 G#1GXFDO{
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); PxE3K-S)G
ResultSet.absolute(9000); Lh<).<S
批量更新 [1KuzCcK}
1、Statement b u"!jHPB
Statement sm = cn.createStatement(); PYzvCf`?
sm.addBatch(sql1); &VcV$8k
sm.addBatch(sql2); ]+$?u&0?w
... [trwBZ^D~
sm.executeBatch() bJ;'`sw1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 =I~mKn
2、PreparedStatement *\q
d
PreparedStatement ps = cn.preparedStatement(sql); MJrR[h]
{ YAmb`CP
ps.setXXX(1,xxx); (4EI-e*6
... 3yXY.>'
ps.addBatch(); ],v=]+R
} {}Za_(Y,]
ps.executeBatch(); O| hpXkV
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 +'w3 =2Bo
r"R#@V\'1b
事务的处理 ri.I pRe
1、关闭Connection的自动提交 zv"Z DRW
cn.setAutoCommit(false); Hq 188<
2、执行一系列sql语句 .GcKa024
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close as_PoCoss
Statement sm ; u~-8d;+?y
sm = cn.createStatement(insert into user...); eR" <33{
sm.executeUpdate(); BF <ikilR
sm.close(); Z(!\%mn
sm = cn.createStatement("insert into corp...); @ry_nKr9
sm.executeUpdate(); 2 Vrw
sm.close(); `~`k_7t.
3、提交 IaXeRq?<
cn.commit(); fd2T=fz-
4、如果发生异常,那么回滚 O7IJ%_A&
cn.rollback();