java 数据库基本操作 #] QZ
1、java数据库操作基本流程 WJ#[LF!e
2、几个常用的重要技巧: q1,~
可滚动、更新的记录集 py4 h(04u
批量更新 Xhm
c6?
事务处理 KPF1cJ2N
SU0
hma8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 xpt:BBo
1、取得数据库连接 Sc0w.5m6
1)用DriverManager取数据库连接 (HVGlw'`
例子 X8|,
String className,url,uid,pwd; .]^?<bG
className = "oracle.jdbc.driver.OracleDriver"; ueudRb
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; G[=c
Ss,
uid = "system"; $i&zex{\
pwd = "manager"; O-^Ma-}
Class.forName(className); t_^4`dW`
Connection cn = DriverManager.getConnection(url,uid,pwd); C]6O!Pb0
2)用jndi(java的命名和目录服务)方式 )e{aN+
例子 &ncvGDGi
String jndi = "jdbc/db"; XSRsGTCC=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); AH^/V}9H
DataSource ds = (DataSource) ctx.lookup(jndi); w<#!h6Y=
Connection cn = ds.getConnection(); +[VXs~I
q
多用于jsp中 Psf#c:*_)
2、执行sql语句 kmW4:EA%
1)用Statement来执行sql语句 !g[Zfo2r"
String sql; V88p;K$+
Statement sm = cn.createStatement(); Ac@VGT:9
sm.executeQuery(sql); // 执行数据查询语句(select) *w&e\i|7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); uT"rq:N
2)用PreparedStatement来执行sql语句 G\i9:7 `
String sql; 9w"*y#_
sql = "insert into user (id,name) values (?,?)"; OXA7w.^
PreparedStatement ps = cn.prepareStatement(sql); DQ3<$0
ps.setInt(1,xxx); dN q$}
ps.setString(2,xxx); h{Y",7]!
...
D7Z /H'|
ResultSet rs = ps.executeQuery(); // 查询 gdc<ZYcM
int c = ps.executeUpdate(); // 更新 7#Ft|5$~q
tw;}jh
3、处理执行结果 1Mzmg[L8
查询语句,返回记录集ResultSet 1M 6D3d_
更新语句,返回数字,表示该更新影响的记录数 a(nlTMfu
ResultSet的方法 dd;~K&_Q/i
1、next(),将游标往后移动一行,如果成功返回true;否则返回false W1~0_;
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )7F/O3Tq
4RO}<$Nx}
4、释放连接 m0wDX*Qn
cn.close(); th_oJcS
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection sC'`~}C
G{}VPcrbC
可滚动、更新的记录集 @JMiO^
1、创建可滚动、更新的Statement -n
1v3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); P:c w|Q
该Statement取得的ResultSet就是可滚动的 M3\AY30L
2、创建PreparedStatement时指定参数 54T`OE
=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /m1\ iM\
ResultSet.absolute(9000); uRvP hkqm
批量更新 ';CNGv -
1、Statement [y(MCf19
Statement sm = cn.createStatement(); @gblW*Zhk
sm.addBatch(sql1); 4(+PD&_J
sm.addBatch(sql2); %b$>qW\*&
... Et$2Y-L.
sm.executeBatch() ^8WRqQdx
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 t.<i:#rj>l
2、PreparedStatement 9[4xFE?|
PreparedStatement ps = cn.preparedStatement(sql); V[LglPt
{ zhQJy?>'m
ps.setXXX(1,xxx); 7!1S)dup
... z/-=%g >HA
ps.addBatch(); d]9z@Pd
} $Sq:q0
ps.executeBatch(); ch]IzdD
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 `Di{}/2
Oketwa
事务的处理 J.a]K[ci
1、关闭Connection的自动提交 x2xRBkRg=
cn.setAutoCommit(false); i!Ba]n
2、执行一系列sql语句 Gc?a +T
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close _BufO7`.
Statement sm ; K(4_a``05
sm = cn.createStatement(insert into user...); 5BIY<B+i
sm.executeUpdate(); U^PgG|0N
sm.close(); dtDFoETz
sm = cn.createStatement("insert into corp...); /ZX}Nc g
sm.executeUpdate(); '1[Ft03
sm.close(); \bXa&Lq
3、提交 =;L|gtH"
cn.commit(); UQsN'r\tS
4、如果发生异常,那么回滚 \z$= K
cn.rollback();