java 数据库基本操作
;i+jJ4
1、java数据库操作基本流程 ?=Kduef
2、几个常用的重要技巧: > ~O.@|
可滚动、更新的记录集 tWcHb #
批量更新 JWxwJex
事务处理 gPPkT"
ym1Y4,
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @q)d
1、取得数据库连接 P&Vv/D
1)用DriverManager取数据库连接 nu%*'.
例子 wibNQ`4k
String className,url,uid,pwd; j3Y['xDv
className = "oracle.jdbc.driver.OracleDriver"; [4)F f
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =I_'.b
uid = "system"; cr;da)
pwd = "manager"; tCt#%7J;a
Class.forName(className); +ZP7{%
Connection cn = DriverManager.getConnection(url,uid,pwd); i83OOV$1J
2)用jndi(java的命名和目录服务)方式 f/?P514h
例子 (tW`=]z-<
String jndi = "jdbc/db"; BI@[\aRLQ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); S_H+WfIHV'
DataSource ds = (DataSource) ctx.lookup(jndi); RViAwTvY
Connection cn = ds.getConnection(); 8}:nGK|kx
多用于jsp中 h<QY5=SF
2、执行sql语句 V0mn4sfs
1)用Statement来执行sql语句 ]`WJOx4
String sql; 1'8YkhQ2a
Statement sm = cn.createStatement(); Nh+ H 9
sm.executeQuery(sql); // 执行数据查询语句(select) 5z)~\;[ -
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); } Q+|W=2t
2)用PreparedStatement来执行sql语句 N;%6:I./
String sql; F#E3q|Q"BS
sql = "insert into user (id,name) values (?,?)"; v3>UV8c'
PreparedStatement ps = cn.prepareStatement(sql); JucY[`|JV
ps.setInt(1,xxx); om>KU$g
ps.setString(2,xxx); 8&dF
... *oix 6
ResultSet rs = ps.executeQuery(); // 查询 Aos+dP5h,8
int c = ps.executeUpdate(); // 更新 #/37V2E
Fsg*FH7J
3、处理执行结果 F!K>K z
查询语句,返回记录集ResultSet lyhiFkO
iH
更新语句,返回数字,表示该更新影响的记录数 _aeBauD
ResultSet的方法 COlaD"Y
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (QB2T2x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 MolgwVd
)+Pus~w
4、释放连接 BMf@M
cn.close(); N'=gep0V@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection fc>L K7M
7G],T++N
可滚动、更新的记录集 klhtKp_p
1、创建可滚动、更新的Statement 2Tppcj v
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [2cD:JL
该Statement取得的ResultSet就是可滚动的 _@/8gPT*i
2、创建PreparedStatement时指定参数 \'j|BJ~L f
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -UT}/:a
ResultSet.absolute(9000); ,hmL/K0"(5
批量更新 &)<)^.@3G^
1、Statement sDV Q#}a
Statement sm = cn.createStatement(); Cgc\
ah
sm.addBatch(sql1); =2x^nW
sm.addBatch(sql2); 7 X4LJf
... 7K:PdF>/
sm.executeBatch() \73ch
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 32
=z)]FZ
2、PreparedStatement 9gZ$
PreparedStatement ps = cn.preparedStatement(sql); P!k{u^$L
{ |ENh)M8}r
ps.setXXX(1,xxx); Xn
;AZu^'R
... NGW xN8P6
ps.addBatch(); / XIhj
} +ck}l2
ps.executeBatch(); FN73+-:n:j
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 i}?>g -(
QmIBaMI#
事务的处理 1BEHw?dLU
1、关闭Connection的自动提交 U/BR*Zn]*
cn.setAutoCommit(false); 9cm#56
2、执行一系列sql语句 {(}By/_
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Z/J y'$x
Statement sm ; #$y?v%^
sm = cn.createStatement(insert into user...); ?bu>r=oIO]
sm.executeUpdate(); :~^(g$Z
sm.close(); L/^I*p,
sm = cn.createStatement("insert into corp...); ?z
u8)U
sm.executeUpdate(); ig &Y
sm.close(); E4xa[iZ
3、提交 w%sT{(Vd`C
cn.commit(); LreP4dRe
4、如果发生异常,那么回滚 Y
nZiTe@
cn.rollback();