java 数据库基本操作 v "Yo
1、java数据库操作基本流程 MEled:i
2、几个常用的重要技巧: *y@Xm~ld
可滚动、更新的记录集 sSdnH_;&
批量更新 c
0/vB
事务处理 A])+Pe
VKtZyhK"h
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .^ o3
1、取得数据库连接 &?wNL@n
1)用DriverManager取数据库连接 ] l@Mo7|w
例子 'G|M_ e
String className,url,uid,pwd; )^q7s&p/
className = "oracle.jdbc.driver.OracleDriver"; !7fL'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 1SY`V?cu
uid = "system"; =,HxtPJ
pwd = "manager"; mDB?;a>
Class.forName(className); :Y\!~J3W
Connection cn = DriverManager.getConnection(url,uid,pwd); J =j6rD
2)用jndi(java的命名和目录服务)方式 L^b /+R#
例子 6!Z>^'6
String jndi = "jdbc/db"; KN\*|)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #J_+
SL[
DataSource ds = (DataSource) ctx.lookup(jndi); L2$`S'U W
Connection cn = ds.getConnection(); BnwYyh
多用于jsp中 Jp#Onl+d6
2、执行sql语句 @5tW*:s
1)用Statement来执行sql语句 ZPO+ #,
String sql; $eQf 5)5
Statement sm = cn.createStatement(); ynQ+yW74Z
sm.executeQuery(sql); // 执行数据查询语句(select) -,Y[`(q
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); $bdtiD
2)用PreparedStatement来执行sql语句 a|5^4 J\%
String sql; 3Gyw^_{J
sql = "insert into user (id,name) values (?,?)"; %k8H'w\
PreparedStatement ps = cn.prepareStatement(sql); A&8{0
ps.setInt(1,xxx); 4
>2g&);B
ps.setString(2,xxx); n5e1ky*9w
... t7; ^rk*
ResultSet rs = ps.executeQuery(); // 查询 ab/^z0GT
int c = ps.executeUpdate(); // 更新 t_\;G~O9-M
R{3vPG
3、处理执行结果 6&qT1nF1
查询语句,返回记录集ResultSet Z+EN]02|
更新语句,返回数字,表示该更新影响的记录数 .r4M]1Of
ResultSet的方法 8+=-!":]
1、next(),将游标往后移动一行,如果成功返回true;否则返回false QH]G>+LI5
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 vXUq[,8yf
W, YYL(L
4、释放连接 Zy+EIx
cn.close(); ?VCM@{9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection E,EpzB$_dj
//O9}-
可滚动、更新的记录集 Ku3/xcu:My
1、创建可滚动、更新的Statement o
/ i
W%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
jph"94
该Statement取得的ResultSet就是可滚动的 5U[bn=n
2、创建PreparedStatement时指定参数 7~H.\4HB
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); YuVg/ '=
ResultSet.absolute(9000); ^.:dT?@R
批量更新 ?K9zTas@
1、Statement l
NhX)D^t
Statement sm = cn.createStatement(); 079mn/8;
sm.addBatch(sql1); "eOFp\vPr
sm.addBatch(sql2); G~$[(Fhk
... j7u\.xu9
sm.executeBatch() E!SxO~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g71|t7Q
2、PreparedStatement 16Gp nb
PreparedStatement ps = cn.preparedStatement(sql); 1*vt\,G
{ l<"Z?z
ps.setXXX(1,xxx); YVT\@+C'
... p*l]I*x'<
ps.addBatch(); z pV+W-j]
} JA(M'&q4
ps.executeBatch(); KvtX>3#qM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 PD$@.pib
YgfQ{3^I
事务的处理 _1EWmHZ?
1、关闭Connection的自动提交 ! {c"C
cn.setAutoCommit(false); Z7:TPY$b
2、执行一系列sql语句 hO H
DXc"
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close v[t*CpGd
Statement sm ; Q/u1$&1
sm = cn.createStatement(insert into user...); Bq
9Eu1
sm.executeUpdate(); m:4Ec>?e
sm.close(); c*:H6(u
sm = cn.createStatement("insert into corp...); $Il:Yw_
sm.executeUpdate();
ek9Y9eJ"
sm.close(); uL1$yf'
3、提交 |o0?u:
cn.commit(); ,LpG E>s
4、如果发生异常,那么回滚 P S [ifC
cn.rollback();