java 数据库基本操作 lh5d6VUA
1、java数据库操作基本流程 6'zy"UkH
2、几个常用的重要技巧: %}:J
9vra
可滚动、更新的记录集 5yI D%
批量更新 {{,%p#/b
事务处理 'h6RZKG T
_: K\v8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Efl+`6`J
1、取得数据库连接 IIZsN*^
1)用DriverManager取数据库连接 _I!&w!3oM
例子 9n7d
"XD2
String className,url,uid,pwd; 0<9TyN6
className = "oracle.jdbc.driver.OracleDriver"; B"v=Fr[
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; [4e5(!e
uid = "system"; uX[
"w|
pwd = "manager"; Ex3woT-
Class.forName(className); }dM^6
Kd%
Connection cn = DriverManager.getConnection(url,uid,pwd); qQ_QF
2)用jndi(java的命名和目录服务)方式 JhcS
例子 GZo4uwG@a
String jndi = "jdbc/db"; KK6YA
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?Dm&A$r
DataSource ds = (DataSource) ctx.lookup(jndi); qfU3Cwy
Connection cn = ds.getConnection(); !:5n
多用于jsp中 ]u ';zJ.
2、执行sql语句 b'YbHUyu
1)用Statement来执行sql语句 M&dtXG8<^
String sql; 7SCI_8`
Statement sm = cn.createStatement(); }0G Ab2
sm.executeQuery(sql); // 执行数据查询语句(select) -tQ|&fl
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); .w~USJ=X
2)用PreparedStatement来执行sql语句 )EoG@:[
String sql; R7i*f/m
sql = "insert into user (id,name) values (?,?)"; A-FwNo2"%
PreparedStatement ps = cn.prepareStatement(sql); xjN~Y D:
ps.setInt(1,xxx); Tx(R3B+u7
ps.setString(2,xxx); wah`
... "6i9 f$N
ResultSet rs = ps.executeQuery(); // 查询 `O/)q^m1L
int c = ps.executeUpdate(); // 更新 L/I-(08!Y:
O}Jb,?p
3、处理执行结果 &bRH(yF
查询语句,返回记录集ResultSet FcA0 \`0M
更新语句,返回数字,表示该更新影响的记录数 p* @L1
ResultSet的方法 *)<tyIHd
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 5z_)
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 +,lD_{}_
Ou^dI
4、释放连接 U VT8TN-T
cn.close(); ! bp"pa9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection qJ@?[|2R
$H^6I8>
可滚动、更新的记录集 u#\3T>o%@
1、创建可滚动、更新的Statement k$UBZ,=iC
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); DYS(ZY)4
该Statement取得的ResultSet就是可滚动的 XHr{\/4V
2、创建PreparedStatement时指定参数 :$j~;)2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); *u}):8=&R
ResultSet.absolute(9000); ^4"_I
批量更新 mI# BQE`p6
1、Statement EB#z\
Statement sm = cn.createStatement(); iJi|* P5dw
sm.addBatch(sql1); m_B5M0},
sm.addBatch(sql2); L*z;-,
... hk
I$ow (
sm.executeBatch() aI{[W;43T
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 J:5n/m^A
2、PreparedStatement gT.-Cf{
PreparedStatement ps = cn.preparedStatement(sql); o;.-I[9h]
{ }/VHeHd
ps.setXXX(1,xxx); v09f#t$;5
... oZ}e
w!V
ps.addBatch(); g:Dg?_o
} X'c5s~9
ps.executeBatch(); m{*l6`dF
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 VxCH}&!
?,j:Y0l.L
事务的处理 B:4u2/!5
1、关闭Connection的自动提交 <7GK *I
cn.setAutoCommit(false); jK =[
2、执行一系列sql语句 {x8`gP\H
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close XP7A.I#q0
Statement sm ; 0\+Qi?&
sm = cn.createStatement(insert into user...); ? _W*7<
sm.executeUpdate(); z+b~#f3
sm.close(); 181P;R=}<
sm = cn.createStatement("insert into corp...); i"'k|TGW^
sm.executeUpdate(); ^6*? a9jO>
sm.close(); L!5f*
3、提交 PT;$@q8
cn.commit(); GYYro&aq{
4、如果发生异常,那么回滚 ?]t8$^m,;
cn.rollback();