java 数据库基本操作 0t6s20*q
1、java数据库操作基本流程 Vg&`f
2、几个常用的重要技巧: `{8Sr)
可滚动、更新的记录集 H&`p9d*(e
批量更新
//f[%j*>
事务处理 %GjF;dJ
h"M}Iz~|V?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 h`?0=:Tru
1、取得数据库连接 x-(?^g
1)用DriverManager取数据库连接 LKftNSkg"
例子 !#g`R?:g
String className,url,uid,pwd; {_KuztJGA
className = "oracle.jdbc.driver.OracleDriver"; 3-~_F*%ST
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $Ob]JAf}
uid = "system"; 23&;28)8
pwd = "manager"; {Km|SG[-q
Class.forName(className); {#0B~Zr
Connection cn = DriverManager.getConnection(url,uid,pwd); .lTU[(qwu
2)用jndi(java的命名和目录服务)方式 J(g!>Sp!p
例子 axonqSf
String jndi = "jdbc/db"; }a|SgI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); $l-j(=Md
DataSource ds = (DataSource) ctx.lookup(jndi); Oa
CkU
Connection cn = ds.getConnection(); J1yy6Wq3[
多用于jsp中 dV.)+X7<
2、执行sql语句 IcI y
1)用Statement来执行sql语句 \D>'
String sql; V=QvwQlZ
Statement sm = cn.createStatement(); @N1ta-D#
sm.executeQuery(sql); // 执行数据查询语句(select) el5F>)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); E}.cz\!.
2)用PreparedStatement来执行sql语句 ;m@>v?zE
String sql; "n:L<F,g
sql = "insert into user (id,name) values (?,?)"; ]oXd|[G
PreparedStatement ps = cn.prepareStatement(sql); Y-7x**I
ps.setInt(1,xxx); Dbz\8gmY
ps.setString(2,xxx); o!wz:|\S
... $1#|<|
ResultSet rs = ps.executeQuery(); // 查询 nS]/=xP{
int c = ps.executeUpdate(); // 更新 BDD^*Y
yEzp+Ky
3、处理执行结果 Ed.~9*m
查询语句,返回记录集ResultSet -L</,>p
更新语句,返回数字,表示该更新影响的记录数 <@(HQuL#
ResultSet的方法 JwxI8Pi*y
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
> ")%4@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 C[_{ $j(J
(;V]3CtU*
4、释放连接 X7Cou6r
cn.close(); K;gm^
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection C} Ewi-
L)HuQVc g
可滚动、更新的记录集 LHR%dt|M
1、创建可滚动、更新的Statement wC..LdSR
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); qA
Jgz7=c
该Statement取得的ResultSet就是可滚动的 =DGaK0n
2、创建PreparedStatement时指定参数 ]'DtuT?Z
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); nu4GK}xI
ResultSet.absolute(9000); @_h/%>0
批量更新 rQ@,Y"
1、Statement ]%"Z[R
Statement sm = cn.createStatement(); ([`-*Hy
sm.addBatch(sql1); &.K=,+0_R/
sm.addBatch(sql2); oC>^V5
... DyYl97+Z?
sm.executeBatch() bmzs!fg_~R
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 aG`G$3 _wx
2、PreparedStatement !@%m3)T8
PreparedStatement ps = cn.preparedStatement(sql); X 4;+`
{ ZWh:&e(
ps.setXXX(1,xxx); }7wQFKME
... b?h"a<7
ps.addBatch(); Xp4pN{h e
} &*T57tE
ps.executeBatch(); htkn#s~=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7?Xfge%\
*"q ~z
事务的处理 "a>%tsl$K
1、关闭Connection的自动提交 0_,V}
cn.setAutoCommit(false); 'FO^VJ;ha
2、执行一系列sql语句 hXmW,+1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close rnEWTk7&
Statement sm ; :M'3U g$t
sm = cn.createStatement(insert into user...); y~]>J^
sm.executeUpdate(); UXR$ 7<D+
sm.close(); pV:X_M6
sm = cn.createStatement("insert into corp...); M)i2)]FS
sm.executeUpdate(); ^Me__Y
sm.close(); ,d&~#W]
3、提交 RVlC8uJ;P
cn.commit(); :
-te
4、如果发生异常,那么回滚 CP["N(fF
cn.rollback();