java 数据库基本操作 EW#.)@-
1、java数据库操作基本流程 RXl52#:
2、几个常用的重要技巧: X@af[J[cQ
可滚动、更新的记录集 4(u+YW GX
批量更新 X[NsdD?w1+
事务处理 kfm8F8sxl
jW2z3.w
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 pl
q$t/.U;
1、取得数据库连接 VC>KW{&J0
1)用DriverManager取数据库连接 OYG8%L
例子
7gD$Q
String className,url,uid,pwd; z>~`9Qiw'
className = "oracle.jdbc.driver.OracleDriver"; @U5+1Hjc
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; (M.Sl
uid = "system"; RU_=VB %
pwd = "manager"; [^ 7^&/0
Class.forName(className); /d'^XYOC
Connection cn = DriverManager.getConnection(url,uid,pwd); s}`=pk/FM
2)用jndi(java的命名和目录服务)方式 ?$-OdABXHK
例子 MfeW|
String jndi = "jdbc/db"; Om>6<3n
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &giJO-^
f
DataSource ds = (DataSource) ctx.lookup(jndi); x3wyIio*
Connection cn = ds.getConnection(); /,E%)K;
多用于jsp中 t4h05 i
2、执行sql语句 fcJ#\-+E
1)用Statement来执行sql语句 0Lc X7gU>
String sql; "-ZuH
Statement sm = cn.createStatement(); /MQd [03]
sm.executeQuery(sql); // 执行数据查询语句(select) A"_;.e`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); db.iMBki
2)用PreparedStatement来执行sql语句 =B<g_9d4
String sql; 7F|T5[*l
sql = "insert into user (id,name) values (?,?)"; ]0m4esK`
PreparedStatement ps = cn.prepareStatement(sql); 3@ay9!Xq
ps.setInt(1,xxx); er l_Gg
ps.setString(2,xxx); a&XURyp
... 3.R?=npA
ResultSet rs = ps.executeQuery(); // 查询 ^>9M2O['!s
int c = ps.executeUpdate(); // 更新 iCl,7$[*
|!57Z4X
3、处理执行结果 <FGNV+?%e
查询语句,返回记录集ResultSet \8_&@uLm
更新语句,返回数字,表示该更新影响的记录数 HpNf f0c
ResultSet的方法 zpg*hlv
1、next(),将游标往后移动一行,如果成功返回true;否则返回false DOU\X N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]dk~C?H
pw- C=MY]
4、释放连接 Q4c>gds`
cn.close(); YEVH?`G
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection )5&w
l)XzU&Sc~
可滚动、更新的记录集 EkOBI[`
1、创建可滚动、更新的Statement ~2rZL
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )W*S6}A
该Statement取得的ResultSet就是可滚动的
[[[p@d/Y
2、创建PreparedStatement时指定参数 n!3_%K0!r&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -f Zm_FE
ResultSet.absolute(9000); s)ZL`S?</
批量更新 mjB%"w!S
1、Statement 6PvV X*5T
Statement sm = cn.createStatement(); c(YNv4*X
sm.addBatch(sql1); \!G&:<h
sm.addBatch(sql2); @Cw<wrem
... ,pf<"^li
sm.executeBatch() &:'Uh
W-t
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 \J9@p
2、PreparedStatement LG&~#x
PreparedStatement ps = cn.preparedStatement(sql); #W!@j"8eK
{ ,/o<O jR
ps.setXXX(1,xxx); M@8
<^CK
... 5&+
qX
2b
ps.addBatch(); kS=OX5
} EkjO4=~UC
ps.executeBatch(); P"3{s+ r
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <A"}Krq?
nuKjp Ap!
事务的处理 b.C!4^
1、关闭Connection的自动提交 3}LTEsdM
cn.setAutoCommit(false); #Q$9Eq8"[
2、执行一系列sql语句 UKk~)Of
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 1_GUi
Statement sm ; MlS<txFPS
sm = cn.createStatement(insert into user...); (y#8z6\dx
sm.executeUpdate(); uF@Q8 7G
sm.close(); f5d"H6%L
sm = cn.createStatement("insert into corp...); tR0o6s@v/<
sm.executeUpdate(); S
G]e^%i
sm.close(); ]hv4EL(zi
3、提交 `){*JPl
cn.commit(); mv<z%y?Oj
4、如果发生异常,那么回滚
Sn" 1XU
cn.rollback();