java 数据库基本操作 it!i'lG
1、java数据库操作基本流程 y$@d%U*rW^
2、几个常用的重要技巧: u:H@]z(x
可滚动、更新的记录集 ]RHR> =;
批量更新 PHRc*G{
事务处理 X'N4a
<LM<,
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 iqf+rBL
1、取得数据库连接 $hB;r
1)用DriverManager取数据库连接 2=tPxO')B
例子 Cnf;5/
String className,url,uid,pwd; 2D-ogSIo
className = "oracle.jdbc.driver.OracleDriver"; qg#WDx /
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Bv"Fx*{W
uid = "system"; WH :+HNl1d
pwd = "manager"; L;.6j*E*
Class.forName(className); X70 vDoW
Connection cn = DriverManager.getConnection(url,uid,pwd); %Fb"&F^7
2)用jndi(java的命名和目录服务)方式 Y1AbG1n|
例子 EK.L>3
String jndi = "jdbc/db"; qS{lay
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ,u QLXF2
DataSource ds = (DataSource) ctx.lookup(jndi); *|AnL}GJ
Connection cn = ds.getConnection(); 6Nx T W
多用于jsp中 8 g'9( )&
2、执行sql语句 2a*1q#MpAt
1)用Statement来执行sql语句 :0ND0A{K:
String sql; HC
w$v#
Statement sm = cn.createStatement(); jsTb0
sm.executeQuery(sql); // 执行数据查询语句(select) `xe[\Z2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); YlOYgr^
2)用PreparedStatement来执行sql语句 4@#1G*OO
String sql; k1>%wR
sql = "insert into user (id,name) values (?,?)"; a AYO(;3
PreparedStatement ps = cn.prepareStatement(sql); (omdmT%D
ps.setInt(1,xxx); r5[om$|*
ps.setString(2,xxx); q p|T,D%
... ,G1|]
~
ResultSet rs = ps.executeQuery(); // 查询 z2t;!]"'l
int c = ps.executeUpdate(); // 更新 "Gcr1$xG8!
h./cs'&
3、处理执行结果 4,f[D9|:
查询语句,返回记录集ResultSet (]j*)~=V
更新语句,返回数字,表示该更新影响的记录数 Fy-nV%P
ResultSet的方法 heZ)+}U~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false P&| =
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `u:U{m
#c4LdZu9
4、释放连接 ;3\Fb3d
cn.close(); M4M
4*o
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (d993~|h
tZ>>aiI3
可滚动、更新的记录集 R#tz"T@
1、创建可滚动、更新的Statement WlP@Tm5g/
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6 6x} |7
该Statement取得的ResultSet就是可滚动的 LYh5f#
2、创建PreparedStatement时指定参数 P;KbS~ SlC
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F~a5yW:R=)
ResultSet.absolute(9000); O|,+@qtH
批量更新 Fhn883
1、Statement `(;d+fof
Statement sm = cn.createStatement(); A4';((OXy
sm.addBatch(sql1); V]H<:UE
sm.addBatch(sql2); 23+6u{
... &m8B%9w
sm.executeBatch() cv:nlq)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3~I<f^K4
2、PreparedStatement e^~t52]
PreparedStatement ps = cn.preparedStatement(sql); 9YHSL[
{ SfJ/(q
ps.setXXX(1,xxx); k;zbq
... 2EE/xnwX
ps.addBatch(); F)e*w:D
} O,qR$#l
ps.executeBatch(); hv*n";V
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 oZ6xHdPc4
F&lc8
事务的处理 Sc Gmft3A
1、关闭Connection的自动提交 nIph[Vs-Z
cn.setAutoCommit(false); r_)-NOp
2、执行一系列sql语句 z('93vsO
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close MBcOIy[&A
Statement sm ; XP2=x_"y
sm = cn.createStatement(insert into user...); 2!68W
X
sm.executeUpdate(); +6<MK;
sm.close(); LDV{#5J
sm = cn.createStatement("insert into corp...); \07Vh6cj
sm.executeUpdate(); 1b3Lan_2
sm.close(); +Q-~~v7,
3、提交 (~Zg\(5#
cn.commit(); K1:F{*
4、如果发生异常,那么回滚 2SG|]=
cn.rollback();