java 数据库基本操作 UAEu.AT
1、java数据库操作基本流程 chakp!S=
2、几个常用的重要技巧: $I|6v
可滚动、更新的记录集 m&a 8/5
批量更新 ?F"mZu
事务处理 SUN!8
qFA
l|j}Ggen
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 jt`\n1q)
1、取得数据库连接 |))O3]-
1)用DriverManager取数据库连接 [ f;o3
例子 :d=:>_[
String className,url,uid,pwd; B>UF dj]-
className = "oracle.jdbc.driver.OracleDriver"; yllEg9L0z
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @/W~lJ!e
uid = "system"; ?aWMU?S
pwd = "manager"; GV0-"9uwX~
Class.forName(className); N%Uk/ c'
Connection cn = DriverManager.getConnection(url,uid,pwd); ]114\JE
2)用jndi(java的命名和目录服务)方式 k9m9IE"9=$
例子 zff<#yK1
String jndi = "jdbc/db"; .D{He9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &>A<{J@VL
DataSource ds = (DataSource) ctx.lookup(jndi); 2(i|n=
Connection cn = ds.getConnection(); czg9tG8
多用于jsp中 YR-Ge
2、执行sql语句 wV^c@.ga
1)用Statement来执行sql语句 2y5d
String sql; v2jpao<K
Statement sm = cn.createStatement(); B+2EIaI
sm.executeQuery(sql); // 执行数据查询语句(select) "[dfb#0z`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); } /*U~!t
2)用PreparedStatement来执行sql语句 I7XJPc4}
String sql; v3b+Ddp
sql = "insert into user (id,name) values (?,?)"; A/!"+Yfw
PreparedStatement ps = cn.prepareStatement(sql); a.2Xl}2o5
ps.setInt(1,xxx); CB^.N>'
ps.setString(2,xxx); A)_HSIVi
... 2rxz<ck(
ResultSet rs = ps.executeQuery(); // 查询 T# .pi@PF>
int c = ps.executeUpdate(); // 更新 K$KVm^`
Qs,4PPEg
3、处理执行结果 W1_.wN$,5
查询语句,返回记录集ResultSet Zo<j"FG
更新语句,返回数字,表示该更新影响的记录数 SS6K7
ResultSet的方法 [H@71+_Q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 2(U;{;\n*
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Y?ZzFd,i&
\}71pzw(
4、释放连接 L+8{%\UPd
cn.close(); m "96%sB
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $wC'qV
*
;EQ7kuJQ?
可滚动、更新的记录集 X?U'GLm
1、创建可滚动、更新的Statement =&F~GCZ>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [@_W-rA
该Statement取得的ResultSet就是可滚动的 ZeqsXz
2、创建PreparedStatement时指定参数 A(*c|Aj9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); s:3b. *t<
ResultSet.absolute(9000); F+ %l=
fs
批量更新 S ,x';"
1、Statement r{KQ3j9O
Statement sm = cn.createStatement(); 24u_}ZQzY
sm.addBatch(sql1); sYbmL`{
sm.addBatch(sql2); uUb`Fy9
... *-*SCA`E^=
sm.executeBatch() Y5c[9\'\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 k [LV^oEg
2、PreparedStatement 6Ad C
PreparedStatement ps = cn.preparedStatement(sql); ~ dk9 7Z8
{ Sc]G7_
ps.setXXX(1,xxx); {isL<
... c:[ZknnCe
ps.addBatch(); h5(OjlMC
} ]!j%Ad
ps.executeBatch(); KP&xk13)
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 >}:
THARr#1b};
事务的处理 mV^~
1、关闭Connection的自动提交 ]tzF
Ob
cn.setAutoCommit(false); yfal'DqKF
2、执行一系列sql语句 dI|D c
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
[8~P
Pc^
Statement sm ; c8T| o=`k6
sm = cn.createStatement(insert into user...); 6bPl(.(3
sm.executeUpdate(); |Sm/s;&c6
sm.close(); o{hX?,4i
sm = cn.createStatement("insert into corp...); ,Ha <lU2K
sm.executeUpdate(); CW2)1%1iz
sm.close(); MT7B'hd
3、提交 3I(;c ,S
cn.commit(); QYi4A"$`
4、如果发生异常,那么回滚 |#sOa
cn.rollback();