java 数据库基本操作 EW
~*@H
1、java数据库操作基本流程 B"7$!C o
2、几个常用的重要技巧: l{nB.m2
可滚动、更新的记录集 )\um"l*\c
批量更新 +]A+!8%Z
事务处理 iPA@<D%
-zPm{a
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Dm>T"4B`/
1、取得数据库连接 Z"l`e0{
1)用DriverManager取数据库连接 6].yRNy"
例子 8dr0 DF$c
String className,url,uid,pwd; ?+bTPl;%'
className = "oracle.jdbc.driver.OracleDriver"; enPzy:C
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !8wZw68"
uid = "system"; +A'}PXm*tu
pwd = "manager"; v>JB
rIb$
Class.forName(className); 'u4}t5Bu5
Connection cn = DriverManager.getConnection(url,uid,pwd); g@$0FY{Q
2)用jndi(java的命名和目录服务)方式 bq c;.4$
例子 /Lq;w'|I
String jndi = "jdbc/db"; x%b]ea
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); b%=1"&JI:
DataSource ds = (DataSource) ctx.lookup(jndi); {[l'S
Connection cn = ds.getConnection(); F;cI0kP=>
多用于jsp中 w~bG<kxP
2、执行sql语句 db{NKwpj'
1)用Statement来执行sql语句 $~
pr+Ei
String sql; `Mo~EHso.
Statement sm = cn.createStatement(); r0~ 7v1rG
sm.executeQuery(sql); // 执行数据查询语句(select) 2Som0T<2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); L@C >-F|p
2)用PreparedStatement来执行sql语句 wlm3~B\64
String sql; sqm%iyC=q
sql = "insert into user (id,name) values (?,?)"; 2AdX)iF@
PreparedStatement ps = cn.prepareStatement(sql); lH6Cd/a
ps.setInt(1,xxx); ph Wc8[Q
ps.setString(2,xxx); :GN)7|:
... ],BJ}~v,X
ResultSet rs = ps.executeQuery(); // 查询 Xulh.:N}
int c = ps.executeUpdate(); // 更新 0|],d?-h
>g5T;NgH9
3、处理执行结果 /AK*aRU^
查询语句,返回记录集ResultSet _DNkdS
[[
更新语句,返回数字,表示该更新影响的记录数 5"76R
Gw=
ResultSet的方法 x(C]O,
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ]3gYuz|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Da9* /
;n yB
4、释放连接 \_iH4<#>
cn.close(); h#(.(d
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection :d!i[W*
tEi@p;Z>
可滚动、更新的记录集 sW>P-
1、创建可滚动、更新的Statement ?TL2'U|M
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }0k"SwX
该Statement取得的ResultSet就是可滚动的 "uV0Oj9:
2、创建PreparedStatement时指定参数 +=n
x|:no
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #J%h!#3g
ResultSet.absolute(9000); v:'P"uU;4
批量更新 X}65\6
1、Statement #Z2>TN
Statement sm = cn.createStatement(); DI$mD{
sm.addBatch(sql1); [8V(N2
sm.addBatch(sql2); TE*> a5C|
... -~rr<D\
sm.executeBatch() Y\Fuj)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !Szgph"ul
2、PreparedStatement Vp- n(Z
PreparedStatement ps = cn.preparedStatement(sql); ^L*VW
gi9
{ Q%gY.n{=
ps.setXXX(1,xxx); @B>%B EC
... : L6-{9$
ps.addBatch(); GI'&g@?u
} F1Zk9%L%9$
ps.executeBatch(); \K4CbZ,.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 IkE'_F
ve64-D
事务的处理 PuUon6bZ
1、关闭Connection的自动提交 MkluK=$
cn.setAutoCommit(false); a$+e8>
2、执行一系列sql语句 2vk8+LA(6
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close d'**wh,
Statement sm ; h0y\,iWXb
sm = cn.createStatement(insert into user...); W#JVU GYD
sm.executeUpdate(); '|dKg"Yl
sm.close(); %8z+R m,Ot
sm = cn.createStatement("insert into corp...); 37ri b
sm.executeUpdate(); 8V53+]c$Y
sm.close(); skmDsZzw
3、提交 P /f ~
cn.commit(); h!JjN$
4、如果发生异常,那么回滚 E|8s2t
cn.rollback();