java 数据库基本操作 A"`(^#a
1、java数据库操作基本流程 q9mYhT/Im
2、几个常用的重要技巧: p/GYfa
dU
可滚动、更新的记录集 AroXf#.
批量更新 xs ^$fn\
事务处理 <+2M,fq+
"Ca?liy
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 2 -
?
1、取得数据库连接 *q/oS8vavd
1)用DriverManager取数据库连接 5Zdxn>
例子 -+#g.1UL/
String className,url,uid,pwd; 7<?~A6
className = "oracle.jdbc.driver.OracleDriver"; tzFgPeo$;
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;q6FdS
uid = "system"; B \z4o\am%
pwd = "manager"; SOPQg?'n=V
Class.forName(className); E%E3h1Ua
Connection cn = DriverManager.getConnection(url,uid,pwd); g,seqh%
2)用jndi(java的命名和目录服务)方式 5
LZ+~!2+
例子 '5vgpmn
String jndi = "jdbc/db"; 4lqowg0
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); sG~5O\,E
DataSource ds = (DataSource) ctx.lookup(jndi); h0)Wy>B=,
Connection cn = ds.getConnection(); Gj}P6V_
多用于jsp中 BHW8zY=F
2、执行sql语句 XCTee
1)用Statement来执行sql语句 s]p3dB#
String sql; B{0m0-l
Statement sm = cn.createStatement(); zXH CP.Rmg
sm.executeQuery(sql); // 执行数据查询语句(select) (!0=~x|Z[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5$ra4+k0
2)用PreparedStatement来执行sql语句 SmJ6Fm6
String sql; D; 0iNcit
sql = "insert into user (id,name) values (?,?)"; <Hq|<^_K
PreparedStatement ps = cn.prepareStatement(sql); X(;,-7Jw
ps.setInt(1,xxx); 8>sToNRNe
ps.setString(2,xxx); BEv>?T
0
... oU.LYz_
ResultSet rs = ps.executeQuery(); // 查询 !Xbr7:UPN1
int c = ps.executeUpdate(); // 更新 C$1}c[
2nFSu9}+r
3、处理执行结果 XdDy0e4{%<
查询语句,返回记录集ResultSet .CL\``
更新语句,返回数字,表示该更新影响的记录数 9rn[46s`
ResultSet的方法 ^BruRgc+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~X/1%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Z ?{;|Z5
b%fn1Ag9
4、释放连接 aiKZ$KLC
cn.close(); n>Rt9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection '14
G0<;yL
v_gQCS
可滚动、更新的记录集 YAIDSZ&l[
1、创建可滚动、更新的Statement [7~ !M*o9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [Pu~kiN
该Statement取得的ResultSet就是可滚动的 x"Hi!h)v
2、创建PreparedStatement时指定参数 'j)xryw
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ueiXY|
ResultSet.absolute(9000); (
*(#;|m
批量更新 WJ9= hr
1、Statement ^+JpI*,
Statement sm = cn.createStatement(); v[_C^;
sm.addBatch(sql1); OgiElA.
sm.addBatch(sql2); n0T\dc~
... ['MG/FKuv
sm.executeBatch() L>Y>b4oy3
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 +oZq~2?*S6
2、PreparedStatement K.Tfu"6
PreparedStatement ps = cn.preparedStatement(sql); ; J~NfL
{ 1Z +3=$P
ps.setXXX(1,xxx); [=Y @Ul
... 1}C|Javkn
ps.addBatch(); af61!?K
} ey@]B5
ps.executeBatch(); 3%]%c6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 $/aZ/O)F
xq2{0q
事务的处理 SSKn7`
1、关闭Connection的自动提交 -,Q
!:
cn.setAutoCommit(false); W27EU/+3
2、执行一系列sql语句 iw\RQ
0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close G SXe=?
Statement sm ; /RuGh8qzP
sm = cn.createStatement(insert into user...); P"J(O<(1-:
sm.executeUpdate(); 4|uh&4"*@W
sm.close(); 6uCa iPV
sm = cn.createStatement("insert into corp...); &+\J "V8
sm.executeUpdate(); yVvO!
sm.close(); [a;U'v*
3、提交 J~6+zBF
cn.commit(); OAMsqeWYA
4、如果发生异常,那么回滚 ,~-"EQT
cn.rollback();