java 数据库基本操作 o#Dk&
cH
1、java数据库操作基本流程 4.aZ#c91_
2、几个常用的重要技巧: lgy<?LI\
可滚动、更新的记录集 @Uvz8*b6
批量更新 tSUEZ62EY
事务处理 Y\P8v
I;(L%TT `
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 1n8/r}q'H
1、取得数据库连接 [l??A3G
1)用DriverManager取数据库连接 9;u@q%;!k
例子 ?e4YGOe.
String className,url,uid,pwd; t%)7t9j
className = "oracle.jdbc.driver.OracleDriver"; @b%=H/5\
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; bsli0FJSh'
uid = "system"; _J#zY-j
pwd = "manager"; pYEMmZ?L
Class.forName(className); |syR6(U}
Connection cn = DriverManager.getConnection(url,uid,pwd); X`K<>0.N
2)用jndi(java的命名和目录服务)方式 lrE5^;/s1
例子 8/#A!Ww]
String jndi = "jdbc/db";
Pmx-8w
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )2o?#8J
DataSource ds = (DataSource) ctx.lookup(jndi); O8r|8]o
Connection cn = ds.getConnection(); pah'>dAL
多用于jsp中 b_taC^-l
2、执行sql语句 |>^JRx
1)用Statement来执行sql语句 SKN`2[ahD
String sql; #:_Kws>+
Statement sm = cn.createStatement(); _;y9$"A
sm.executeQuery(sql); // 执行数据查询语句(select) Dx?,=~W9
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); LonxT&"!D
2)用PreparedStatement来执行sql语句 Bkc4TO
String sql; >Cp0.A:UC#
sql = "insert into user (id,name) values (?,?)"; 2l'6.
PreparedStatement ps = cn.prepareStatement(sql);
jB2[(
ps.setInt(1,xxx); v{4$D~I
ps.setString(2,xxx); g:@#@1rB6
... _|2:_N=
ResultSet rs = ps.executeQuery(); // 查询 h(dvZ=
%
int c = ps.executeUpdate(); // 更新 %wy.TN
.~;\eW [
3、处理执行结果 ?l{nk5,?-Y
查询语句,返回记录集ResultSet 5C]x!>kX
更新语句,返回数字,表示该更新影响的记录数 4pF*"B
ResultSet的方法 !;A\.~-!G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;$|nrwhy
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 \gaw6S>n}
Wn2NMXK
4、释放连接 @Nx9)
cn.close(); hn@08t G
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cV6D<,)
KV *#T20T
可滚动、更新的记录集 .`eN8Dl1
1、创建可滚动、更新的Statement Dz/ "M=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); K\r8g=U
该Statement取得的ResultSet就是可滚动的 + &Eqk
2、创建PreparedStatement时指定参数 .L~AL|2_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (w3YvG.
ResultSet.absolute(9000); 2/^3WY1U
批量更新 </zEg3F\
1、Statement C,r;VyW6BI
Statement sm = cn.createStatement(); <%eG:n,#
sm.addBatch(sql1); U8?mc
sm.addBatch(sql2); d7upz]K9g
... [z{1*Xc
sm.executeBatch() g!|kp?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 9Y9GwL]T
2、PreparedStatement :5<UkN)R(
PreparedStatement ps = cn.preparedStatement(sql); #;yZ
{ =;
Ff4aF
ps.setXXX(1,xxx); N4!O.POP
... Ti5-6%~&
ps.addBatch(); 6H$FhJF
} -Q*gW2KmV
ps.executeBatch(); 6cXyJW
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <]2w n
I\ob7X'Xu!
事务的处理 lymCH
1、关闭Connection的自动提交 NXrlk
cn.setAutoCommit(false); CD~.z7,LC
2、执行一系列sql语句 >kVz49j
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close L="}ErmK
Statement sm ; >y3=|
sm = cn.createStatement(insert into user...); U5de@Y
sm.executeUpdate(); 3]S$ih&A
sm.close(); f]CXu3w(J
sm = cn.createStatement("insert into corp...); qX{+oy5
sm.executeUpdate(); q_58;Bv
sm.close(); (!WD1w
3、提交 nNn:-
cn.commit(); kffcm/
4、如果发生异常,那么回滚 ~]2K^bh8&
cn.rollback();