java 数据库基本操作 :.
ja~Q
1、java数据库操作基本流程 e)2s2y@zi
2、几个常用的重要技巧: =8F]cW'1`
可滚动、更新的记录集 SXx2
批量更新 7VQk$im399
事务处理 'cx&:s
g5*Zg_G/
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 M4 :}`p=
1、取得数据库连接 V=,VOw4
1)用DriverManager取数据库连接 ,3`RM$
例子 AK*F,H9
String className,url,uid,pwd; 4d*=gy%
className = "oracle.jdbc.driver.OracleDriver"; ch%-Cg~%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~~_!&
uid = "system"; DxLN{g]B
pwd = "manager"; p kR+H|
Class.forName(className); C r~!N|(
Connection cn = DriverManager.getConnection(url,uid,pwd); ,!RbFME&H
2)用jndi(java的命名和目录服务)方式 Iq-+X3i
例子 f;;(Q-.
String jndi = "jdbc/db"; <""
fJ`7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); D<2|&xaR
DataSource ds = (DataSource) ctx.lookup(jndi); .l->O-=
Connection cn = ds.getConnection(); :>K=kZ=k
多用于jsp中 Ws;}D}+
2、执行sql语句 aQK>q. t
1)用Statement来执行sql语句 )`ZTu -|
String sql; jHxg(]
Statement sm = cn.createStatement(); KF"&9nB
sm.executeQuery(sql); // 执行数据查询语句(select) >6(91J
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); P7Ws$7x
2)用PreparedStatement来执行sql语句 fQ^45ulz
String sql; |oSx*Gh
sql = "insert into user (id,name) values (?,?)"; 3UBg"1IC
PreparedStatement ps = cn.prepareStatement(sql); {T]^C
ps.setInt(1,xxx); : _>/Yd7-&
ps.setString(2,xxx); b'N(eka
... 9cu0$P`}5
ResultSet rs = ps.executeQuery(); // 查询 4ISZyO=
int c = ps.executeUpdate(); // 更新
5Y\wXqlY
<XV\8Y+n
3、处理执行结果 fr1/9E;
查询语句,返回记录集ResultSet OI9V'W$
更新语句,返回数字,表示该更新影响的记录数 q+/c+u?=^
ResultSet的方法 X=<-rFW
1、next(),将游标往后移动一行,如果成功返回true;否则返回false :-=,([TJ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 vElVw.
P
zd+_
BPT
4、释放连接 72gQ<Si
cn.close(); ly<1]jK
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .I@jt?6X
Dwq }O
可滚动、更新的记录集 e)[>E\u _
1、创建可滚动、更新的Statement j z aC
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); V(%L}0[]
该Statement取得的ResultSet就是可滚动的 v}v! hs Q
2、创建PreparedStatement时指定参数 /\S1p3EW*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 4&Uq\,nx
ResultSet.absolute(9000); IQFt4{aK3
批量更新 j7vp@l6`L
1、Statement L+}q !'8S
Statement sm = cn.createStatement(); ptS1d$
sm.addBatch(sql1); .cTK\
sm.addBatch(sql2); R(c:#KF#8
... d85\GEF9i
sm.executeBatch() ?t&sT
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 38wt=0br
2、PreparedStatement `3Gjj&c
PreparedStatement ps = cn.preparedStatement(sql); %d5;JEgA:g
{ LeA=*+zP[
ps.setXXX(1,xxx); a$7}_kb
... ?G[<~J3-E
ps.addBatch(); @?A39G{
} f3>8ZB4
ps.executeBatch(); @iZ"I i&+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Cz2OGM*mz?
*uAsKU
事务的处理 wL'tGAv
1、关闭Connection的自动提交 Y!VYD_'P
cn.setAutoCommit(false); O'~c;vBI
2、执行一系列sql语句 JCu3,O!q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close zW`$T88~
Statement sm ; YEZd8Y
sm = cn.createStatement(insert into user...); >9o(84AxIH
sm.executeUpdate(); /qW5M4.w
sm.close(); $td=h)S^`
sm = cn.createStatement("insert into corp...); 18|i{fE;
sm.executeUpdate(); ;* vVucx
sm.close(); zDbjWd
3、提交 1sL#XB$@N
cn.commit(); L~yu
4、如果发生异常,那么回滚 G:f\wK[
cn.rollback();