java 数据库基本操作 xv*mK1e
1、java数据库操作基本流程 p;5WLAF
2、几个常用的重要技巧: V\G>e{
可滚动、更新的记录集 A]J^{h0k
批量更新 ?k3b\E3
事务处理
1y@-
?UxY4m%R;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 cpy"1=K~M
1、取得数据库连接 iY($O/G[+
1)用DriverManager取数据库连接 u qyf3bK
例子 oF>GWstTR
String className,url,uid,pwd; \8$`:3,@
className = "oracle.jdbc.driver.OracleDriver"; x'KsQlI/
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; OP&[5X+Y
uid = "system"; D!P?sq _5r
pwd = "manager"; XMdc n,
Class.forName(className); 7*5ctc!dG
Connection cn = DriverManager.getConnection(url,uid,pwd); I,S'zHR
2)用jndi(java的命名和目录服务)方式 dL\8^L
例子 Ax%BnkU
String jndi = "jdbc/db"; NV gLq@F
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~mp$P+M(%p
DataSource ds = (DataSource) ctx.lookup(jndi); 3(&.[o
Z
Connection cn = ds.getConnection(); R#`itIYh
多用于jsp中 "a
g_
2、执行sql语句 '
EDi6
1)用Statement来执行sql语句
U<t-LF3
String sql; <2Q@^
Statement sm = cn.createStatement(); Y/^<t'o&
sm.executeQuery(sql); // 执行数据查询语句(select) n>4S P_[E7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); S?{5DxilO
2)用PreparedStatement来执行sql语句 ep?0@5D}]
String sql; xHGoCFB
sql = "insert into user (id,name) values (?,?)"; 3dbf!
PreparedStatement ps = cn.prepareStatement(sql); VZ,T`8"
ps.setInt(1,xxx); gfYB|VyWo
ps.setString(2,xxx); 3/AUV%+
... .$k"+E
ResultSet rs = ps.executeQuery(); // 查询 ZFON]$Zk
int c = ps.executeUpdate(); // 更新 !lF^~x
:qbG%_PJ
3、处理执行结果 VMWg:=~$
查询语句,返回记录集ResultSet }"-r;i
更新语句,返回数字,表示该更新影响的记录数 | rvr Sab)
ResultSet的方法 c|R/,/
1、next(),将游标往后移动一行,如果成功返回true;否则返回false jQb D2x6(
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9PJDT]
Z C93C7lJ
4、释放连接 SSXS
cn.close(); (*ng$zZ$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection E8i:ER $$7
vo$66A
可滚动、更新的记录集 R
u5&xIQ
1、创建可滚动、更新的Statement X W)A~wPBs
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _Pkh`}W:
该Statement取得的ResultSet就是可滚动的 p5l$On
2、创建PreparedStatement时指定参数 ?a%i|Z7!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 4I*Mc%dD
ResultSet.absolute(9000); Q.1ohj0)
批量更新 s]c$]&IGG
1、Statement &[RU.Q!_H
Statement sm = cn.createStatement(); 8:% R|b
sm.addBatch(sql1); /6zpVkV
sm.addBatch(sql2); t {"iIz_S
... Elp!,(+&6
sm.executeBatch() BcLt95;.\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Y+GeT#VHe
2、PreparedStatement "o3"1s>d{
PreparedStatement ps = cn.preparedStatement(sql); .LhmYbQ2WE
{ CiI:
uU
ps.setXXX(1,xxx); _w;+Jh
... :Y>]6
ps.addBatch(); At(9)6n8
} G 7]wg>*
ps.executeBatch(); Bx-,"Z \
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 zfb _ )
c0&'rxi(B
事务的处理 v|@n8ED|@K
1、关闭Connection的自动提交 C8:"+;
cn.setAutoCommit(false); YZRB4T9
2、执行一系列sql语句 wF8\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close j\f$r,4
Statement sm ; *]WXM.R8
sm = cn.createStatement(insert into user...); LFyceFbm
sm.executeUpdate(); l7,qWSsnK
sm.close(); Zk
UuniO
sm = cn.createStatement("insert into corp...); uR@`T18
sm.executeUpdate(); Qiw4'xQm
sm.close(); W_\L_)^X
3、提交 f9UaAdJ(
cn.commit(); wG5RN;`V
4、如果发生异常,那么回滚 kA!(}wRL
cn.rollback();