java 数据库基本操作 ~F8M_
1、java数据库操作基本流程 wD|,G!8E2
2、几个常用的重要技巧: :34#z.O
可滚动、更新的记录集 y:Xs/RS
批量更新 _{CMWo"l
事务处理 (vm&&a@
cjzhuH/y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接
m9bR
%j
1、取得数据库连接 /C(lQs*l
1)用DriverManager取数据库连接 Wx#((T
例子 f}q4~NPn-
String className,url,uid,pwd; y+f@8]
className = "oracle.jdbc.driver.OracleDriver"; &6fNPD(|
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; m(QGP\Ya
uid = "system"; K;jV"R<9
pwd = "manager"; %VG;vW\V
Class.forName(className); Qs2E>C
Connection cn = DriverManager.getConnection(url,uid,pwd); ' uvTOgP,
2)用jndi(java的命名和目录服务)方式 E"!I[
例子 Wz)O,X^
String jndi = "jdbc/db"; )i8Hdtn
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); VU+` yQp
DataSource ds = (DataSource) ctx.lookup(jndi); 3`PPTG
Connection cn = ds.getConnection(); mG4myQ?$
多用于jsp中 ,"?h_NbF
2、执行sql语句 [.\uHt
1)用Statement来执行sql语句 cIqk=_]
String sql; P3|_RHIb
Statement sm = cn.createStatement(); }7iWm XlI
sm.executeQuery(sql); // 执行数据查询语句(select) UhuEE
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); JmDi{B?
2)用PreparedStatement来执行sql语句 ConXP\M-
String sql; )cA#2mlS'1
sql = "insert into user (id,name) values (?,?)"; X._skq
PreparedStatement ps = cn.prepareStatement(sql); Q 6djfEN>
ps.setInt(1,xxx); E(DNK
ps.setString(2,xxx); r|$@Wsb?#
... :;[pl|}tM
ResultSet rs = ps.executeQuery(); // 查询 +_Nr a
int c = ps.executeUpdate(); // 更新 r[xj,eIb
-dXlGOD+C
3、处理执行结果 )eFXjnHN
查询语句,返回记录集ResultSet K)z{R n
更新语句,返回数字,表示该更新影响的记录数 uC{qaMQ
ResultSet的方法 w,hl<=:(FB
1、next(),将游标往后移动一行,如果成功返回true;否则返回false O;RsYs9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 R `}C/'Ty
-#0(Jm'
4、释放连接 F?!P7 zW
cn.close(); "`P/j+-rt
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9>gxJ7pY
nx#0*r}5
可滚动、更新的记录集 lJaR,,
1、创建可滚动、更新的Statement v+a$Xh3Y~
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); &L3OP@;
该Statement取得的ResultSet就是可滚动的 +/u)/ey
2、创建PreparedStatement时指定参数 `Y HnL4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <a9<rF =r
ResultSet.absolute(9000); ?f@g1jJP
批量更新 :
utY4
1、Statement oNW.-gNT
Statement sm = cn.createStatement(); 8MIn~
sm.addBatch(sql1); Cjh0 .{
sm.addBatch(sql2); Leg)q7n
... y $,K^f
sm.executeBatch() !*2cK>`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 cd_\?7
2、PreparedStatement "R8: s
PreparedStatement ps = cn.preparedStatement(sql); P#^-{;Bu
{ L=`QF'Im
ps.setXXX(1,xxx); 0,1x-
yD
... O~3<P3W
ps.addBatch(); iBCZx>![;
} G- _h 2
ps.executeBatch(); X[' VZz7
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 R _#x
)OjTn"
事务的处理 :bBLP7eyV
1、关闭Connection的自动提交 M%(B6};J
cn.setAutoCommit(false); R]dN-'U
2、执行一系列sql语句 UZcsMMKH
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g.L~Z1-
Statement sm ; *\#/4_yB}
sm = cn.createStatement(insert into user...); b2L9%8h
sm.executeUpdate(); 4XL$I*;4
sm.close(); c@SNbY4}%
sm = cn.createStatement("insert into corp...); irjOGn
sm.executeUpdate(); KGM9
b
sm.close(); |3LD"!rEx
3、提交 &,v-AL$:Q
cn.commit(); #}M\ J0QG
4、如果发生异常,那么回滚 qV;E%XkkS
cn.rollback();