java 数据库基本操作
))%@@l[
1、java数据库操作基本流程 |V5 $'/Y
2、几个常用的重要技巧: g;u<[>'I
可滚动、更新的记录集 J=f:\]@Oy
批量更新 v_?s1+w
事务处理 owfp^hla
B2ek&<I7N
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :t2 9`x
1、取得数据库连接 Z;|0"K
1)用DriverManager取数据库连接 vjOG?-
例子 %igFHh?
String className,url,uid,pwd; GInZ53cQ
className = "oracle.jdbc.driver.OracleDriver"; *F26}q
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .g6PrhzFbk
uid = "system"; Pg!;o=
{M
pwd = "manager"; n"^/UQ|#j
Class.forName(className); CT$& zEIm
Connection cn = DriverManager.getConnection(url,uid,pwd); wGov|[X
2)用jndi(java的命名和目录服务)方式 dv1x78xG>
例子 +cPE4(d
String jndi = "jdbc/db"; \Owful
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); nG4Uk2>
DataSource ds = (DataSource) ctx.lookup(jndi); yFPaWW
Connection cn = ds.getConnection(); 8o8b'tW^
多用于jsp中 b7W=HR
2、执行sql语句 `:-@E2
1)用Statement来执行sql语句 3/A!_Uc(
String sql; Lo$Z>u4(c
Statement sm = cn.createStatement(); 3*X,{%
sm.executeQuery(sql); // 执行数据查询语句(select) fg>B
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); STFQ";z$
2)用PreparedStatement来执行sql语句 2A@Y&g(6T7
String sql; ain#_H
sql = "insert into user (id,name) values (?,?)"; @);!x41f
PreparedStatement ps = cn.prepareStatement(sql); 73^T*
ps.setInt(1,xxx); imJ[:E
ps.setString(2,xxx); v&[X&Hu[
... F#!@}K8
ResultSet rs = ps.executeQuery(); // 查询 =|qt!gY)Y
int c = ps.executeUpdate(); // 更新 ]Omb :
<WQ<<s@#pb
3、处理执行结果 rm5T=fNJ
查询语句,返回记录集ResultSet T!^?d5uW#
更新语句,返回数字,表示该更新影响的记录数 Vid{6?7kh
ResultSet的方法 tdw\Di#m
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
Gh)sw72
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 gW6G+
6oTbn{=UUq
4、释放连接 %h/#^esi
cn.close(); ^\7 x5gO
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2$SofG6D}
]RJb;
可滚动、更新的记录集 `Q1WVd29
1、创建可滚动、更新的Statement q{9X.-]}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); lgv-)5|O+H
该Statement取得的ResultSet就是可滚动的 ]]h:#A2
2、创建PreparedStatement时指定参数 Y^94iOk%T
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?' ez.a}
ResultSet.absolute(9000); 5 CY_Ay\
批量更新
')~Y
1、Statement M<#)D
Statement sm = cn.createStatement(); q5'yD;[hE
sm.addBatch(sql1); `lu"y F
sm.addBatch(sql2); +s/N@]5nW
... AihL>a%
sm.executeBatch() qmue!Fv#g
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ; mo\ yW1
2、PreparedStatement ATMogxh
PreparedStatement ps = cn.preparedStatement(sql); ; $ ?jR
c
{ oM18aR&
ps.setXXX(1,xxx); #iRyjD
... @o3R`ZgC]\
ps.addBatch(); +LI*!(T|lm
} 5E\<r/FeJ
ps.executeBatch(); Jm);|#y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /BjGAa(
w.T=Lzp
事务的处理 .j:.WnW
1、关闭Connection的自动提交 ^M"=A}h
cn.setAutoCommit(false); Rvu3Qo+
2、执行一系列sql语句 ~J. Fl[
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close VkN[=0a,
Statement sm ; Tk v
sm = cn.createStatement(insert into user...); }{kTh%^
sm.executeUpdate(); aG8D%i0
sm.close(); q563,s
sm = cn.createStatement("insert into corp...); ?2;n=&ZM
sm.executeUpdate(); g~^{-6Vg
sm.close(); ot>EnHfV
3、提交 \yX !P1
cn.commit(); Kt4\&l-De
4、如果发生异常,那么回滚 z:i X]df
cn.rollback();