java 数据库基本操作 ?{[
v+t#
1、java数据库操作基本流程 .6Pw|xu`Pw
2、几个常用的重要技巧: F1yqxWHeo
可滚动、更新的记录集 VXwU?_4J.
批量更新 Bx<
<~[Ws}
事务处理 GB=X5<;
p;>ec:z3M
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 cPlZXf
1、取得数据库连接 ?Wlb3;
1)用DriverManager取数据库连接 8)_XJ"9)G
例子 yd
d7I&$
String className,url,uid,pwd; (,0(
className = "oracle.jdbc.driver.OracleDriver"; RMdk:YvBg
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; YIG~MP
uid = "system"; I=`U7Bis"
pwd = "manager"; W_"sM0
w
Class.forName(className); ]>5/PD,wWy
Connection cn = DriverManager.getConnection(url,uid,pwd); a.k.n<
2)用jndi(java的命名和目录服务)方式 M /"I2m
例子 T4Pgbop
String jndi = "jdbc/db"; cK( C&NK
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); k%WTJbuG<)
DataSource ds = (DataSource) ctx.lookup(jndi); *Q
"wwpl?
Connection cn = ds.getConnection(); 0AL=S$B)
多用于jsp中 +~ P2C6@G
2、执行sql语句 '-Vt|O_Q
1)用Statement来执行sql语句
@niHl
String sql; Rl?_^dPx
Statement sm = cn.createStatement(); _@
qjV~%Sy
sm.executeQuery(sql); // 执行数据查询语句(select) j8^I z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); G[uK -U
2)用PreparedStatement来执行sql语句 4V)kx[j
String sql; 8;RUf~q?
sql = "insert into user (id,name) values (?,?)"; KPKt^C
PreparedStatement ps = cn.prepareStatement(sql); 65JF`]
ps.setInt(1,xxx); f<d`B]$(
ps.setString(2,xxx); I-]?"Q7Jz
... {EB;h\C
ResultSet rs = ps.executeQuery(); // 查询 *av<E
int c = ps.executeUpdate(); // 更新 z!ZtzD]cb
KQ!8ks]
3、处理执行结果 nv|NQ
Tk
查询语句,返回记录集ResultSet {HltvO%8
更新语句,返回数字,表示该更新影响的记录数 un mJbY;t
ResultSet的方法 hd%Fnykq
1、next(),将游标往后移动一行,如果成功返回true;否则返回false l*Gvf_UH
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 N2^=E1|_
MzdV2.
4、释放连接 %}SrL*
cn.close(); e5ZX
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection JzQ_{J`k
6,8h]?u.
可滚动、更新的记录集 )4 e.k$X^
1、创建可滚动、更新的Statement vtg!8u4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); x}Eg.S
该Statement取得的ResultSet就是可滚动的 {T$9?`h~M
2、创建PreparedStatement时指定参数 Cgk<pky1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); y@S$^jk.
ResultSet.absolute(9000); U`(ee*}o
批量更新 k_#ak%m/
1、Statement t%0VJB,Q2
Statement sm = cn.createStatement(); tKOmoC
sm.addBatch(sql1); {L{o]Ii?g
sm.addBatch(sql2); 1hY{k{+o
... HmGWht6R
sm.executeBatch() %v
M-mbX
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Ju@c~Xm
2、PreparedStatement EH J.T~X
PreparedStatement ps = cn.preparedStatement(sql); t\dN DS
{ :D5Rlfj
ps.setXXX(1,xxx); L\J;J%fz.
... b|:YIXml
ps.addBatch(); hn
GZ=
} .5_2zat0H
ps.executeBatch(); 2`K=Hby
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gh]cXuph
ZPLm]I\]
事务的处理 AofKw
1、关闭Connection的自动提交 SwGx?U
cn.setAutoCommit(false); Mk 6(UXY
2、执行一系列sql语句 Qz1E 2yJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close PO:{t
Statement sm ; UcHJR"M~c
sm = cn.createStatement(insert into user...); `g=J%p
sm.executeUpdate(); 6xx ?A>:
sm.close(); 6Pl<'3&
sm = cn.createStatement("insert into corp...); MAR'y8I
sm.executeUpdate(); Gx/Oi)&/
sm.close(); >y7?-*0
3、提交 ~,Zc% s~|
cn.commit(); +Mb.:_7'
4、如果发生异常,那么回滚 dFB]~QEK
cn.rollback();