java 数据库基本操作 0F9p'_C
1、java数据库操作基本流程 4KB>O)YNg'
2、几个常用的重要技巧: bDjm:G
可滚动、更新的记录集 CqR^w(
批量更新 l$ufW|
事务处理 !![HR6"Q
tA{hx-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 uUJH^pW
1、取得数据库连接 /Suh&qw>
1)用DriverManager取数据库连接 nR8r$2B+t
例子 ,vB~9^~
String className,url,uid,pwd; Jsf"h-)P
className = "oracle.jdbc.driver.OracleDriver"; $3]]<oH
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; SGP)A(,k9
uid = "system"; 8:fq!m
pwd = "manager"; U# U*^#
Class.forName(className); OCEhwB0
Connection cn = DriverManager.getConnection(url,uid,pwd); U?=-V8#M|
2)用jndi(java的命名和目录服务)方式 ;VS$xnZ
例子 mOfTq]
@B
String jndi = "jdbc/db"; [Zne19/
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); =XFyEt
DataSource ds = (DataSource) ctx.lookup(jndi); z
-uW,
Connection cn = ds.getConnection(); d8.A8<wUr
多用于jsp中 ~PyZh5x
2、执行sql语句 7f>~P_
1)用Statement来执行sql语句 ne
8rF.D
String sql; _B7+n"t\r
Statement sm = cn.createStatement(); "=,IbC
sm.executeQuery(sql); // 执行数据查询语句(select) )`K!XX$%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); dO4Jf9)
2)用PreparedStatement来执行sql语句 p(.z#o#
String sql; J~|:Q.Rt`
sql = "insert into user (id,name) values (?,?)"; K)W:@,*
PreparedStatement ps = cn.prepareStatement(sql); ffR<G&"n~b
ps.setInt(1,xxx); :gTtWJ04]
ps.setString(2,xxx); +g&M@8XO&
... t&Jrchk
ResultSet rs = ps.executeQuery(); // 查询 th%T(D5n
int c = ps.executeUpdate(); // 更新 O96%U$W
.4[M7)
3、处理执行结果 eI1C0Uz1
查询语句,返回记录集ResultSet
=@!s[
更新语句,返回数字,表示该更新影响的记录数 5xhYOwQBo
ResultSet的方法 b<j*;n.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Yc^,Cj{OM
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Y2}m/7aF
),XDY_9K
4、释放连接 DFp">1@`PR
cn.close(); !q 9PO
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection M8${&&[;
e \.
可滚动、更新的记录集 $l_\9J913
1、创建可滚动、更新的Statement kL"Y>@H
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); HL%|DCo
该Statement取得的ResultSet就是可滚动的 =>L2~>[
2、创建PreparedStatement时指定参数 o]<J&<WM
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5%"sv+iO
ResultSet.absolute(9000); cH6J:0>W
批量更新 ")9jt^
1、Statement >[S\NAE>
Statement sm = cn.createStatement(); 4e?MthJ>
sm.addBatch(sql1); \?vn0;R4
sm.addBatch(sql2); y>0Gmr
... (Q"~bP{F
sm.executeBatch() wQYW5X
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 lsU`~3nr
2、PreparedStatement H^+Znmo
PreparedStatement ps = cn.preparedStatement(sql); iN1_T
{ /L=Y8tDt
ps.setXXX(1,xxx); s#FX2r3=Fg
... E.G]T#wt0
ps.addBatch(); T:g%b @
} *fI\|%K
ps.executeBatch(); '^(qlCI
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 u<EPK*O*
q-qz-cR
事务的处理 Wa9yyc
1、关闭Connection的自动提交 f=-R<l
cn.setAutoCommit(false); ucFfxar"
2、执行一系列sql语句 0qL.Rnt
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close #!t6'*
Statement sm ; .gY=<bG/fA
sm = cn.createStatement(insert into user...); =nv/
r
sm.executeUpdate(); r |2{(+
sm.close(); Gm=e;X;r
sm = cn.createStatement("insert into corp...); 0~e6\7={
sm.executeUpdate(); TP mb]j
sm.close(); XQZiJ
%'
3、提交 _7
^:1i~:.
cn.commit(); qfF2S
4、如果发生异常,那么回滚 ~-'-<-
cn.rollback();