java 数据库基本操作 s!E-+Gw
1、java数据库操作基本流程 Px4zI9;cB
2、几个常用的重要技巧: K,IPVjS
可滚动、更新的记录集 PHa#;6!5
批量更新 B&m?3w
事务处理 N>Pufr
#:68}f"$
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 =;3|?J0=
1、取得数据库连接 []Z| *+=Q
1)用DriverManager取数据库连接 e-os0F
例子 6zLz<p?
String className,url,uid,pwd; Y4Z?`TL
className = "oracle.jdbc.driver.OracleDriver"; ::vw1Es
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; GSW{h[Op
uid = "system"; 7,e=|%7.
pwd = "manager"; j$]t`6gG
Class.forName(className); lm&C!{K
Connection cn = DriverManager.getConnection(url,uid,pwd); 3A} ntA!
2)用jndi(java的命名和目录服务)方式 b['TRYc=:
例子 *0R=(Gy
String jndi = "jdbc/db"; %;zWS/JhL
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); A?;/]m;
DataSource ds = (DataSource) ctx.lookup(jndi); 5.|rzk>
Connection cn = ds.getConnection(); kkrQ;i)Z
多用于jsp中 zoOm[X=?3
2、执行sql语句 vfegIoZ
1)用Statement来执行sql语句 !@/?pXt|
String sql;
+X;6%O;
Statement sm = cn.createStatement(); `>8|
sm.executeQuery(sql); // 执行数据查询语句(select) ?k_=?m
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -lMC{~h\(S
2)用PreparedStatement来执行sql语句 hBE}?J>
String sql; $Y,]D*|"K
sql = "insert into user (id,name) values (?,?)"; igz:ek`
PreparedStatement ps = cn.prepareStatement(sql); D2!ww{t
ps.setInt(1,xxx); f8?K_K;\
ps.setString(2,xxx); `s:| 4;.
... VUF7-C*
ResultSet rs = ps.executeQuery(); // 查询 -"a+<(Y
int c = ps.executeUpdate(); // 更新 2%W(^Lj
h)wR[N]n
3、处理执行结果 NE9e brK
查询语句,返回记录集ResultSet >M:5yk@
更新语句,返回数字,表示该更新影响的记录数 jgbw'BBu
ResultSet的方法 u'K<-U8H
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 59^@K"J
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 T"d]QYJS
FcW ?([l
4、释放连接 )X^nzhZ2O"
cn.close(); _i8$!b2Mr
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection RV(}\JU
i]$d3J3
可滚动、更新的记录集 jSYj+k
1、创建可滚动、更新的Statement 1| gP
:t}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Y5MHd>m
该Statement取得的ResultSet就是可滚动的 }(tGjx]
2、创建PreparedStatement时指定参数 "4tRy9q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 8:&@MZQ&!
ResultSet.absolute(9000); L8j,?u#
批量更新 2qr%xK'^B
1、Statement mG@Q}Y(
Statement sm = cn.createStatement(); c~RIl5j
sm.addBatch(sql1); u8<=FV3
sm.addBatch(sql2); %?wuKZLnc
... XbH X,W$h
sm.executeBatch() E?XA/z !
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _ _)Z Q
2、PreparedStatement K5.C*|w
PreparedStatement ps = cn.preparedStatement(sql); huTJ
a2
{ F'#3wCzt
ps.setXXX(1,xxx); 95!xTf
... C3_*o>8
ps.addBatch(); g{J3Ba
} FD@! z
:
ps.executeBatch(); _+;x4K;
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "7<4NV@yQ
@P.l8|w
事务的处理 1QN]9R0`#7
1、关闭Connection的自动提交 _&z>Id`w
cn.setAutoCommit(false); f(_qcgXp
2、执行一系列sql语句 -xcz+pHQ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =;{S>P!I(t
Statement sm ; 'QV4=h`
sm = cn.createStatement(insert into user...); 2)8lJXM$L
sm.executeUpdate(); wM&G-~9ujk
sm.close(); WWe.1A,
sm = cn.createStatement("insert into corp...); *"4<&F
S
sm.executeUpdate(); Yr31GJ}K
sm.close(); rb_G0/R
3、提交 #YNb&K
n
cn.commit(); aFSZYyPxwv
4、如果发生异常,那么回滚 ;% !?dH6
cn.rollback();