java 数据库基本操作 Otxa<M+"
1、java数据库操作基本流程 NhCAv+
2、几个常用的重要技巧: {( dP
可滚动、更新的记录集 44j,,k
批量更新 ]<q'U> N
事务处理 X?R
|x[
:t%)5:@A
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 dEG ]riO
1、取得数据库连接 Fn> <q:
1)用DriverManager取数据库连接 Uh%6LPg^
例子 ]'e AO
String className,url,uid,pwd; KD=bkZ&
className = "oracle.jdbc.driver.OracleDriver"; iU XM(]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; >+SZd7p
uid = "system"; >"b[r
pwd = "manager"; 8(^
,r#Gy
Class.forName(className); u6pIdt
Connection cn = DriverManager.getConnection(url,uid,pwd); c(CJ{>F%
2)用jndi(java的命名和目录服务)方式 ?y46o2b*)
例子 ZBC@xM&-
String jndi = "jdbc/db"; 6: GN(R$0
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /vy?L\`)#
DataSource ds = (DataSource) ctx.lookup(jndi); Mn{XVXY@qm
Connection cn = ds.getConnection(); R~c IT:i
多用于jsp中 _6LH"o3
2、执行sql语句 d
"B5==0I
1)用Statement来执行sql语句 XR<G}x
String sql; hRLKb}
Statement sm = cn.createStatement(); (s;zRb!4L
sm.executeQuery(sql); // 执行数据查询语句(select) 9':/Sab:7v
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); oAaf)?8
2)用PreparedStatement来执行sql语句 ^9s"FdB]24
String sql; E)Srj~$d
sql = "insert into user (id,name) values (?,?)"; Z>&K&ttJ
PreparedStatement ps = cn.prepareStatement(sql); 97(n\Wt2
ps.setInt(1,xxx); W%WC(/hor
ps.setString(2,xxx); {>A
8g({i
... k5C>_(
A
ResultSet rs = ps.executeQuery(); // 查询 TGtyJ3x\
int c = ps.executeUpdate(); // 更新 G_0)oC@Jl:
`;e^2
3、处理执行结果 gLV^Z6eE
查询语句,返回记录集ResultSet ;!:F#gahv
更新语句,返回数字,表示该更新影响的记录数 )6g&v'dq
ResultSet的方法 x~nQm]@`h
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6}"lm]b
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `[&v
9[Y*k^.!
4、释放连接 O[L\T
cn.close(); K]9tc)
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection rCkYfTYI
}.OxJ=M
可滚动、更新的记录集 h>.9RX &
1、创建可滚动、更新的Statement pb6 Q?QG,
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Z+Xc1W^
该Statement取得的ResultSet就是可滚动的 OK.-]()!
2、创建PreparedStatement时指定参数 }d@LSaM
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Y6+k9$h
ResultSet.absolute(9000); N:d
D*[QZ
批量更新 PJ}[D.elO
1、Statement Ae.]F)w_\
Statement sm = cn.createStatement(); `P#8(GU
sm.addBatch(sql1); dbg|VoNf
sm.addBatch(sql2); sC9-+}
... We|-5
sm.executeBatch() [1mIdwS
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 }~V,_Fv
2、PreparedStatement Xa>}4j.
PreparedStatement ps = cn.preparedStatement(sql); |fx#KNPf]
{ NPP3(3C
ps.setXXX(1,xxx); +H[Q~P8'[
... H8(C>w-'
ps.addBatch(); %@o&*pF^,
} C9G U6Ao
ps.executeBatch(); A
xRl*B
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 sBbL~ce50?
FDl,Ey^r/
事务的处理 A7.JFf>
1、关闭Connection的自动提交 rpx0|{m
cn.setAutoCommit(false); f x%z|K
2、执行一系列sql语句 s!NisF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close `I@)<d
Statement sm ; 7G?Ia%u
sm = cn.createStatement(insert into user...); $+iu\MuX
sm.executeUpdate(); zz[g{[SN
sm.close(); ?!R%o
sm = cn.createStatement("insert into corp...); {7/ A
sm.executeUpdate(); #wGQv
sm.close(); AUu5g
3、提交 >c&4_?d&,A
cn.commit(); K90D1sD
4、如果发生异常,那么回滚 {jrZ?e-q
cn.rollback();