java 数据库基本操作 mv1_vF:
1、java数据库操作基本流程 88dq8T4
2、几个常用的重要技巧: B@,L83
可滚动、更新的记录集 @+v;B:
批量更新 V8z91
事务处理 ^XV=(k;~bX
3zO'=gwJ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 4No!`O-!&
1、取得数据库连接 axl!zu*
1)用DriverManager取数据库连接 XeaO,P
例子 #Fua^]n
String className,url,uid,pwd; HqW|
className = "oracle.jdbc.driver.OracleDriver"; G?Y2 b
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; kpM5/=f/@
uid = "system"; iB Ld*B|#K
pwd = "manager"; o,!r t1&0
Class.forName(className); EV:y}
Connection cn = DriverManager.getConnection(url,uid,pwd); |]5g+sd
2)用jndi(java的命名和目录服务)方式 ])=k";76
例子 gJNp]I2R
String jndi = "jdbc/db"; hi>sDU<x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #L-3eW=f
DataSource ds = (DataSource) ctx.lookup(jndi); NXvu}&H
Connection cn = ds.getConnection(); U$J l5[`F^
多用于jsp中 N/A.1W
2、执行sql语句 Z6}B}5@y
1)用Statement来执行sql语句 "+js7U-
String sql; zMT0ToG
Statement sm = cn.createStatement(); 4c2*)x$@
sm.executeQuery(sql); // 执行数据查询语句(select) Go}C{(4T
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); llbj-9OZL
2)用PreparedStatement来执行sql语句 C:n55BE9
String sql; 54kd>)|"ag
sql = "insert into user (id,name) values (?,?)"; m8F-#?~
PreparedStatement ps = cn.prepareStatement(sql); N\IdZX%u
ps.setInt(1,xxx); zof>S>5>R7
ps.setString(2,xxx); LI[ w?6B
... )MFa~/x
ResultSet rs = ps.executeQuery(); // 查询 k`W.tMo
int c = ps.executeUpdate(); // 更新 o$4n D#P3
S1pikwB
3、处理执行结果 +Io[o6*
查询语句,返回记录集ResultSet DWep5$>&K
更新语句,返回数字,表示该更新影响的记录数 dZ&/Iz
ResultSet的方法 xp%,@]p
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 3&!X8Lhv
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 dA[Z\
lHwQ'/r
4、释放连接 @x">e][B
cn.close(); Akf?BB3bC
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 7WG"_A~V
DCv~^
可滚动、更新的记录集 $-m`LF@
1、创建可滚动、更新的Statement Exox&T
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F8km8lPQl
该Statement取得的ResultSet就是可滚动的 Wyf+xr'Ky
2、创建PreparedStatement时指定参数 :Vc+/ZyW
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -Cwx %
ResultSet.absolute(9000); 9u/ "bj
批量更新 )/h~csy:~
1、Statement fr8:L!9
Statement sm = cn.createStatement(); p%_#"dkC7
sm.addBatch(sql1); 'v&k5`Qq
sm.addBatch(sql2); |s
:b9sfA
... ["}0umt
sm.executeBatch() "gXz{$q
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
Q_'3}:4
2、PreparedStatement a_/\.
PreparedStatement ps = cn.preparedStatement(sql); dI<s)!
{ 0"$Ui#r`
ps.setXXX(1,xxx); 4A:@+n%3m
... CRvUD.D
ps.addBatch(); !']=7It{
} w+bQpIPM
ps.executeBatch(); ygr[5Tl
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _B)LRD+Hj
2xH9O{
事务的处理 ig^9lM'
1、关闭Connection的自动提交 =jjUwcl
cn.setAutoCommit(false); Tm@d;O'E1
2、执行一系列sql语句 w@7NoD=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close SLO;c{EFH
Statement sm ; 306C_M\$
sm = cn.createStatement(insert into user...); ce&)djC7U
sm.executeUpdate(); %B`MO-
sm.close(); uBw1Xud[YI
sm = cn.createStatement("insert into corp...); LX[J6YKR
sm.executeUpdate(); ]Qe;+p9vU
sm.close(); Lz2 AWqR
3、提交 -Y%#z'^-
cn.commit(); d paZ6g
4、如果发生异常,那么回滚 )s(J8J[b*L
cn.rollback();