java 数据库基本操作 irZFV
1、java数据库操作基本流程 "uPy,<l
2、几个常用的重要技巧: TV}}dw
可滚动、更新的记录集 h`}3h<
8
批量更新 <_./SC
事务处理 9ElCg"
uGl| pJ\y=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @E53JKYhY
1、取得数据库连接
Q\3 Z|%
1)用DriverManager取数据库连接 1Fi86
例子 qJ_1*!!91
String className,url,uid,pwd; =)OC|?9C\
className = "oracle.jdbc.driver.OracleDriver"; .6pOvGKb
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =[<m[.)i
uid = "system"; g+C!kaC)
pwd = "manager"; S?0)1O
Class.forName(className); NS,5/t
Connection cn = DriverManager.getConnection(url,uid,pwd); Z2bcCIq4
2)用jndi(java的命名和目录服务)方式 i$KpDXP\
例子 ]fI/(e_U
String jndi = "jdbc/db"; T/P7F\R
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); d'9:$!oz
DataSource ds = (DataSource) ctx.lookup(jndi); S2VVv$r_6
Connection cn = ds.getConnection(); xDO7A5
多用于jsp中 D["MUB4l
2、执行sql语句 jRpdft
1)用Statement来执行sql语句 VZIR4J[\.
String sql; www`=)A;
Statement sm = cn.createStatement(); GW2')}g
sm.executeQuery(sql); // 执行数据查询语句(select) 1[;@AE2Y
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); mEuHl>
2)用PreparedStatement来执行sql语句 s2v(=
String sql; yO>V/5`
sql = "insert into user (id,name) values (?,?)"; 2PSTGG8JV
PreparedStatement ps = cn.prepareStatement(sql); 7>
Pgc
ps.setInt(1,xxx); hD<f3_k
ps.setString(2,xxx); XL}<1-}
... L6i|:D32p
ResultSet rs = ps.executeQuery(); // 查询 )J3kxmlzQ
int c = ps.executeUpdate(); // 更新 ".~{:=
qsg>5E
3、处理执行结果 !)Rr]
~
查询语句,返回记录集ResultSet NgB 7?]vu
更新语句,返回数字,表示该更新影响的记录数 y$tX-9U
ResultSet的方法 ;S/7 h6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false BvSIM%>h
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 i`OrMzL
1{2eY%+C
4、释放连接 !|m9|
cn.close(); P l{QOR
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9''p[V.3
IdM*5Y>f
可滚动、更新的记录集 YJ2ro-X
1、创建可滚动、更新的Statement 5QWNZJ&}d
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,dd WBwMK
该Statement取得的ResultSet就是可滚动的 aN^IP
2、创建PreparedStatement时指定参数 lz~J"$b
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); s([Wn)I
ResultSet.absolute(9000); )8{6+{5lu
批量更新 %>XN%t'6aT
1、Statement xNN@ 1P[*
Statement sm = cn.createStatement(); hWcTI{v
sm.addBatch(sql1); i.rU&yT%
sm.addBatch(sql2); 77:'I
... wh~sZ
sm.executeBatch() %TK&)Q% h5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 O=jN&<rb
2、PreparedStatement DPJh5d
PreparedStatement ps = cn.preparedStatement(sql); MPRO
!45Z
{ f(u&XuZ
ps.setXXX(1,xxx); ]RFdLV?
... BEw{X|7
ps.addBatch(); 5 z]\$=TE
} }BN\/;<A
ps.executeBatch(); F$hZRZ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Ud3""C5B
GH3#E*t+[
事务的处理 cINHH !v
1、关闭Connection的自动提交 _JOP[KHb
cn.setAutoCommit(false); TV{)n'aA
2、执行一系列sql语句 Z%v6xP.
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close jFj~]]j
Statement sm ; D&[Z;,CHMA
sm = cn.createStatement(insert into user...); B2hfD-h,>
sm.executeUpdate(); E5B8 Z?$a
sm.close(); H(\V+@~>AD
sm = cn.createStatement("insert into corp...); }#b
%"I0
sm.executeUpdate(); b4~H3|
sm.close(); If}lJ6jZ
3、提交 ;1LG&h,K
cn.commit(); U4wpjHg
4、如果发生异常,那么回滚 i;lE5
cn.rollback();