java 数据库基本操作 ]es|%j 2
1、java数据库操作基本流程 N^;lp<{6?
2、几个常用的重要技巧: ~fXNj-'RW
可滚动、更新的记录集 g257jarkMF
批量更新 q<09]i
事务处理 I-#!mFl
zIc6L3w$
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Jq_\r'YE
1、取得数据库连接 V;SfW2`)
1)用DriverManager取数据库连接 K?l|1jez(#
例子 Vl5r~+$|
String className,url,uid,pwd; 7Jb&~{DVk
className = "oracle.jdbc.driver.OracleDriver"; QV[&2&&^<<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =D(a~8&,
uid = "system"; Q7+WV`&
pwd = "manager"; ioi/`iQR
Class.forName(className); $xu2ZBK
Connection cn = DriverManager.getConnection(url,uid,pwd); [MeivrJ+
2)用jndi(java的命名和目录服务)方式 ^*P?gG
例子 Y9abRrK
String jndi = "jdbc/db"; [<B,6nAl
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); k5RzW4zq;
DataSource ds = (DataSource) ctx.lookup(jndi); ]5'*^rz ^
Connection cn = ds.getConnection(); O@$>'Z
多用于jsp中 d!I%AlV
2、执行sql语句 /E6)>y66
1)用Statement来执行sql语句 *JOK8[Qn
String sql; %<yW(s9{
Statement sm = cn.createStatement(); HS=w9:,
sm.executeQuery(sql); // 执行数据查询语句(select) ]D6<6OB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); L91(|gQP
2)用PreparedStatement来执行sql语句 W8<QgpV*
String sql; Zl5DlRuw
sql = "insert into user (id,name) values (?,?)"; i3 js'?7E
PreparedStatement ps = cn.prepareStatement(sql); k7Nx#%xx
ps.setInt(1,xxx); &^ERaPynd
ps.setString(2,xxx); O!Ue0\1Kj0
... hTBJ\1
-
ResultSet rs = ps.executeQuery(); // 查询 }Z <I%GT
int c = ps.executeUpdate(); // 更新 caEIE0H~
T#&1q]P1F
3、处理执行结果 !KV!Tkx h
查询语句,返回记录集ResultSet Nr@,In|JS
更新语句,返回数字,表示该更新影响的记录数 88u[s@
ResultSet的方法 R/{h4/+vJ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 51}C`j|V3{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 oX6Cd:c-
yc0
1\o
4、释放连接 z{R
Mb
cn.close(); ]FR#ZvM>x
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection r%: :q^b3
GUQ3XF\
可滚动、更新的记录集 ,5 ,r.
1、创建可滚动、更新的Statement A7QT4h&6
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ufR|V-BWx
该Statement取得的ResultSet就是可滚动的 #W:.Fsq
2、创建PreparedStatement时指定参数 li3X}
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); UHJro9
ResultSet.absolute(9000); 8Ogg(uS70'
批量更新 dhLd2WSyH
1、Statement V xN!Ki=
Statement sm = cn.createStatement(); b?k,_;\
sm.addBatch(sql1); .t^1e
sm.addBatch(sql2); YloE4PAY7
... 3meZ]u
sm.executeBatch() kb-XEJ}L
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 i?>>%juK
2、PreparedStatement F, =WfM\
PreparedStatement ps = cn.preparedStatement(sql); ILG&l<!E
{ g9GPyU
ps.setXXX(1,xxx); }T%E;m-
... w^~s4Q_>>
ps.addBatch(); ~Q- /O~
} ({4?RtYm
ps.executeBatch(); UXa%$gwFw
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 j;Z
hI y
SOD3MsAK
事务的处理 +MS*YpPW
1、关闭Connection的自动提交 c3fd6Je5
cn.setAutoCommit(false); GWx?RIKF
2、执行一系列sql语句 Vl7V?`_4
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $SLyI$<gP
Statement sm ; @&h_+|:-
sm = cn.createStatement(insert into user...); wC1)\ld
sm.executeUpdate(); 6_EfOD9
sm.close(); s_u!
RrC
sm = cn.createStatement("insert into corp...); j"0TAYmXwu
sm.executeUpdate(); nCldH|>5w
sm.close(); 9dg+@FS}=
3、提交 &WbHM)_n
cn.commit(); h#h)=;
4、如果发生异常,那么回滚 <SRSJJR|(
cn.rollback();