java 数据库基本操作 99l>CYXd
1、java数据库操作基本流程 '%zN
2、几个常用的重要技巧: _pz,okO[V
可滚动、更新的记录集 K0EY<Ltq
批量更新 ]6$,IKE7
事务处理 KGV.S
54q4CagFq
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 H&w:`JYDL3
1、取得数据库连接 w(76H^e
1)用DriverManager取数据库连接 ID67?:%r
例子 K3vseor
String className,url,uid,pwd; prNhn:j
className = "oracle.jdbc.driver.OracleDriver"; Y7<zm}=(/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Vq3gceo'0A
uid = "system"; }xAie(
pwd = "manager"; N$\ bg|v
Class.forName(className); [>W"R1/
Connection cn = DriverManager.getConnection(url,uid,pwd); KQG-2oW
2)用jndi(java的命名和目录服务)方式 7d&DrI@~
例子 1R0ffP]
String jndi = "jdbc/db"; r\$6'+Si
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _iG2J&1'L
DataSource ds = (DataSource) ctx.lookup(jndi); A6Ghj{~
Connection cn = ds.getConnection(); =N YgGEFq.
多用于jsp中 /y}"M
2、执行sql语句 T>}0) s
1)用Statement来执行sql语句 Bk?8zYp
String sql; T
n"e
Statement sm = cn.createStatement(); bA}AD`5
sm.executeQuery(sql); // 执行数据查询语句(select) {Ge+O<mD
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); z]^+^c_
2)用PreparedStatement来执行sql语句 @Ii-NmOr
String sql; HXQ e\r
sql = "insert into user (id,name) values (?,?)"; `I5O4|K)
PreparedStatement ps = cn.prepareStatement(sql); +c^_^Z$_4o
ps.setInt(1,xxx); s|Z:}W?{
ps.setString(2,xxx); PG{i,xq_B{
... ?b||Cr
ResultSet rs = ps.executeQuery(); // 查询 =43I1&_
int c = ps.executeUpdate(); // 更新 D`6iDit
s}6+8 fE"
3、处理执行结果 QX[Djz0H8
查询语句,返回记录集ResultSet n[!;yO
更新语句,返回数字,表示该更新影响的记录数 ;Vg^!]LL#
ResultSet的方法 6cM<>&e
1、next(),将游标往后移动一行,如果成功返回true;否则返回false \)ip>{WG
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =96G8hlT
#
;K,,ku
x
4、释放连接 C:]s;0$3'9
cn.close(); 8wr8:(Y$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection EXuLSzQwv
MkwU<ae AB
可滚动、更新的记录集 D^Te%qnW
1、创建可滚动、更新的Statement b"I~_CL|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); LO)GTyzvJ
该Statement取得的ResultSet就是可滚动的 {Fbg]'FQ
2、创建PreparedStatement时指定参数 8zY)J #
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); .*BA 1sjE
ResultSet.absolute(9000); #~L!pKM
批量更新 B$rTwR"(-
1、Statement s f(iE(o
Statement sm = cn.createStatement(); PgMbMH
sm.addBatch(sql1); z~,mRgc$B
sm.addBatch(sql2); 2
P=[
... &VDl/qnaL
sm.executeBatch() 2d*_Qq1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 \K;op2
2、PreparedStatement 089 k.WG
PreparedStatement ps = cn.preparedStatement(sql); -"=)z/S
{ (S`6Q
ps.setXXX(1,xxx); zDD4m`2
... aX;A==>
ps.addBatch(); x?#I4RJH;
} U&X2cR &a
ps.executeBatch(); YutQ ]zYA.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 SxJ$b
l3.
事务的处理 ]4`t\YaT
1、关闭Connection的自动提交 ;B~P>n}}_]
cn.setAutoCommit(false); .u l
53 m
2、执行一系列sql语句 'BY-OA#xJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?~J i-{#X
Statement sm ; l<(cd,
sm = cn.createStatement(insert into user...); > !L&>OOx
sm.executeUpdate(); [E7MsX
sm.close(); `H>b5
sm = cn.createStatement("insert into corp...); t2-
^-g6
sm.executeUpdate(); FZF @
sm.close(); OR:[J5M)
3、提交 4*TmlY
cn.commit(); _%~$'Hy
4、如果发生异常,那么回滚 zvY+R\,in
cn.rollback();