java 数据库基本操作 D`;Q?fC
1、java数据库操作基本流程 WJG& `PP
2、几个常用的重要技巧: L< MIl[z7
可滚动、更新的记录集 EwSE;R -
批量更新 c\.8hd=<
事务处理 #ii,GN~N
6Xjr0C+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 zt 1Pu
/e
1、取得数据库连接 O87Ptr8
1)用DriverManager取数据库连接 .\0PyV(
例子 LoHL}1BG-
String className,url,uid,pwd; :/H fMJ
className = "oracle.jdbc.driver.OracleDriver"; kan?2x
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ^-3R+U- S
uid = "system"; 90%alG1>y
pwd = "manager"; )v!>U<eprD
Class.forName(className); 3|/<Pk
Connection cn = DriverManager.getConnection(url,uid,pwd); 'F'v/G~F
2)用jndi(java的命名和目录服务)方式 ';buS -|6
例子 s=lkK/ [
String jndi = "jdbc/db"; sR`WV6!9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Qh )QdW4
DataSource ds = (DataSource) ctx.lookup(jndi); .bh>_ W_h
Connection cn = ds.getConnection(); :tu_@3bg-
多用于jsp中 DkP%1Crdr
2、执行sql语句 tlU&p'
1)用Statement来执行sql语句 :@6,|2be=
String sql; G]fl33_}l
Statement sm = cn.createStatement(); lx<]v^
sm.executeQuery(sql); // 执行数据查询语句(select) X@u-n_
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $I%75IZ
2)用PreparedStatement来执行sql语句 Ku{DdiTg>
String sql; L]o
5=K
sql = "insert into user (id,name) values (?,?)"; ?XVJ$nzW
PreparedStatement ps = cn.prepareStatement(sql); gB!K{ Io'
ps.setInt(1,xxx); C LhD[/Fo
ps.setString(2,xxx); UE4zmIq
... h' OLj#H
ResultSet rs = ps.executeQuery(); // 查询 X0X!:gX
int c = ps.executeUpdate(); // 更新 F=C8U$'S
Gc)
Zu`67
3、处理执行结果 djVE x}
查询语句,返回记录集ResultSet M2ig iR
更新语句,返回数字,表示该更新影响的记录数 i"uAT$x e
ResultSet的方法 ;mV,r,\dH
1、next(),将游标往后移动一行,如果成功返回true;否则返回false W`fE@* k0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 CB5 ~!nKv&
K
(yuL[p`
4、释放连接 0:^L>MO
cn.close(); $wa )e
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection K[ZgT$zZ
f!}c0nb
可滚动、更新的记录集 :%Dw3IrOM
1、创建可滚动、更新的Statement ms'!E)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9?)r0`:#
该Statement取得的ResultSet就是可滚动的 .S&S#}$/]
2、创建PreparedStatement时指定参数 v_*E:E
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); kI974:e42
ResultSet.absolute(9000); YX+Da"\
批量更新 `F:PWG`
1、Statement G`NH~C
Statement sm = cn.createStatement(); %gB 0\C
sm.addBatch(sql1); Z']D8>d
sm.addBatch(sql2); W! FmC$Kc
... }Y(yDg;"
sm.executeBatch() 3Q^@!hu
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 h 5Y3
v
2、PreparedStatement !*wK4UcX"
PreparedStatement ps = cn.preparedStatement(sql); [o)P
{
&UG7
g
ps.setXXX(1,xxx); n$ye:p>`-
... >a98H4
ps.addBatch(); K,YKU?z6
} p8F5b8]*
ps.executeBatch(); Ek'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 iq`y
9viQ<}K<
事务的处理 f<A Bs4w
1、关闭Connection的自动提交 STp}?Cb
cn.setAutoCommit(false); '\dau>
2、执行一系列sql语句 V)\|I8"
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close \HFh?3-g
Statement sm ; m?hC!n>
sm = cn.createStatement(insert into user...); =)C}u6
sm.executeUpdate(); (
q^umw
sm.close(); W`],
sm = cn.createStatement("insert into corp...); 8Pklw^k
sm.executeUpdate(); RRy3N
)HR
sm.close(); Fs7/3
3、提交 5EDM?G
cn.commit(); :0pxacD"!
4、如果发生异常,那么回滚 6o&{~SV3
cn.rollback();