java 数据库基本操作 ~BF&rx5Q
1、java数据库操作基本流程 yr6V3],Tp
2、几个常用的重要技巧: Tk>#G{Wb-
可滚动、更新的记录集 %*U'@r(A
批量更新 j [a(#V{
事务处理 XkqCZHYkS
GeqPRah
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 qLCR] _*
1、取得数据库连接 dI2
V>vk
1)用DriverManager取数据库连接 /{[o~:'p
例子 lk!@?
String className,url,uid,pwd; %)|s1B'd
className = "oracle.jdbc.driver.OracleDriver"; %C0Dw\A*:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @ 7u 0v
uid = "system"; >usL*b0%
pwd = "manager"; 43w}qY1
Class.forName(className); GB^B r6
Connection cn = DriverManager.getConnection(url,uid,pwd); W/ \g~=vo
2)用jndi(java的命名和目录服务)方式 5N]"~w*
例子 \^LFkp
String jndi = "jdbc/db"; QnDg6m)+
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); u?"Vm
DataSource ds = (DataSource) ctx.lookup(jndi); =%7-ZH9
Connection cn = ds.getConnection(); H+#FSdy#
多用于jsp中 -4K5-|>O
2、执行sql语句 /}$+uBgJm
1)用Statement来执行sql语句 #G3<7PK
String sql; b$7 +;I;
Statement sm = cn.createStatement(); [WJ+h~~
o
sm.executeQuery(sql); // 执行数据查询语句(select) Zfw,7am/
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); vI?, 47Hj+
2)用PreparedStatement来执行sql语句 0_/[k*Re
String sql; >!JS:5|
sql = "insert into user (id,name) values (?,?)"; DDZ@$L!
PreparedStatement ps = cn.prepareStatement(sql); [Pp'Ye~K@c
ps.setInt(1,xxx); N+|d3X!
ps.setString(2,xxx); yauvXosX
... cNrg#Asen&
ResultSet rs = ps.executeQuery(); // 查询 _aphkeqd
int c = ps.executeUpdate(); // 更新 ?0.NIu,,o
wL1MENzp*z
3、处理执行结果 @WhHUd4s
查询语句,返回记录集ResultSet ,6/V"kqIP
更新语句,返回数字,表示该更新影响的记录数 qK+5NF|
ResultSet的方法 5-V pJ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false hPh-+Hb
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "Q<MS'a
# _1`)VS
4、释放连接 =|=(l)8
cn.close(); (:_$5&i7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection dr(*T
VVZ'i.*_3?
可滚动、更新的记录集 ]'cs.
1、创建可滚动、更新的Statement D9df=lv
mD
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +vH4MwG$.&
该Statement取得的ResultSet就是可滚动的 >?b!QU*a
2、创建PreparedStatement时指定参数 !if
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #spCtZE
ResultSet.absolute(9000); w]H->B29C
批量更新 O^.#d
1、Statement Q8NX)R
Statement sm = cn.createStatement(); s%S
sm.addBatch(sql1); CAJ'zA|o
sm.addBatch(sql2); IPk4
;,
... *hx
sm.executeBatch() @FeTz[
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3F3A%C%
2、PreparedStatement p ?!/+
PreparedStatement ps = cn.preparedStatement(sql); zda 3
,U2o
{ Uly ue
ps.setXXX(1,xxx); 3<!7>]A
... Wri<h:1
ps.addBatch(); Sf'CN8
}
DrR@n~
ps.executeBatch(); \<' ?8ri#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 KwS@D9bok
\Z/@C lCm
事务的处理 WLT"ji0w2
1、关闭Connection的自动提交 Z~CjA%l
cn.setAutoCommit(false); 6'/ #+,d'
2、执行一系列sql语句 3$ pX
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [6fQ7uFMM8
Statement sm ; p'%s=TGwv
sm = cn.createStatement(insert into user...); e=
AKD#
sm.executeUpdate(); fex@,I&
sm.close(); \e;iT\=.(
sm = cn.createStatement("insert into corp...); {.yB'.k?
sm.executeUpdate(); KPF1cJ2N
sm.close(); QV!up^Zso
3、提交 Sc0w.5m6
cn.commit(); HtFDlvdy]
4、如果发生异常,那么回滚 C _Dn{
cn.rollback();