java 数据库基本操作 ;
YQB
1、java数据库操作基本流程 jI*@&3
2、几个常用的重要技巧: d4\JM 65
可滚动、更新的记录集 };9s8VZE
批量更新 ,h'Q
事务处理 9wldd*r
&,jUaC5I
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :}Yk0*
1、取得数据库连接 Hv,ll1@h
1)用DriverManager取数据库连接 U), HrI>;
例子 qmFbq<&
String className,url,uid,pwd; .nrbd#i-
className = "oracle.jdbc.driver.OracleDriver"; UWV%y P
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Y3&,U
uid = "system"; [Tbnfst
pwd = "manager"; ,&S0/j
Class.forName(className); fK+E5~vQ
Connection cn = DriverManager.getConnection(url,uid,pwd); %,02i@Fc
2)用jndi(java的命名和目录服务)方式 Q*ELMib
例子 w->Y92q]
String jndi = "jdbc/db"; eUB!sR%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); "49dsKIOH
DataSource ds = (DataSource) ctx.lookup(jndi); *Ic^9njt
Connection cn = ds.getConnection(); UhS:tT]7
多用于jsp中 $o5i15Oy.
2、执行sql语句 Kd+E]$F_OH
1)用Statement来执行sql语句 XL.f`N.O
String sql; .9B@w+=6
Statement sm = cn.createStatement(); 0,DrVGa
sm.executeQuery(sql); // 执行数据查询语句(select) .qZz'Eq[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {fHor
2)用PreparedStatement来执行sql语句 ^ `";GnH0
String sql; _!DH/?aU
sql = "insert into user (id,name) values (?,?)"; ZZo<0kDk
PreparedStatement ps = cn.prepareStatement(sql); jF}kV%E
ps.setInt(1,xxx); l~]] RgU
ps.setString(2,xxx); *(q?O_3,b
... SF-"3M
ResultSet rs = ps.executeQuery(); // 查询 cRrJZ9
int c = ps.executeUpdate(); // 更新 M3@qhEf?vk
s<!G2~T
3、处理执行结果 w[gt9]}N
查询语句,返回记录集ResultSet a7ZufB/
更新语句,返回数字,表示该更新影响的记录数 sZ&|omN
ResultSet的方法 S8/~'<out
1、next(),将游标往后移动一行,如果成功返回true;否则返回false JP6 Noia
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]zJO)(d$>
7UW\|r
4、释放连接 ij-'M{f
cn.close(); } (-9d
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <Y}m/-sD5
zE$HHY2ovi
可滚动、更新的记录集 !PEKMDh
1、创建可滚动、更新的Statement QA0uT{x90
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +39uKOrZ
该Statement取得的ResultSet就是可滚动的 ZJ)Z
2、创建PreparedStatement时指定参数 zqNzWX
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); b,~pwbHf
ResultSet.absolute(9000); ^t
gjs$M|
批量更新 [iq^'E
1、Statement E#rQJ
Statement sm = cn.createStatement(); *m<[ sS
sm.addBatch(sql1); U; m@
sm.addBatch(sql2); p+]S)K GZw
... *aCVkFp
sm.executeBatch() W9w(a:~hY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 [=jZP,b&),
2、PreparedStatement q%kCTw
PreparedStatement ps = cn.preparedStatement(sql); eu$VKLY*
{ vJ'22)n
ps.setXXX(1,xxx); -kLBq:M
... Bv@p9 ]
n
ps.addBatch(); <H60rON
} 0O`Rh"O
ps.executeBatch(); yVK
;
"
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 N^oP,^+U
HLPRTta.
事务的处理 Fh)xm* u(
1、关闭Connection的自动提交 jH<Sf: Y(
cn.setAutoCommit(false); `f~bnL
2、执行一系列sql语句 j`.&4.7+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 8el6z2
Statement sm ; cK]n"6N[
sm = cn.createStatement(insert into user...); xtv%C
sm.executeUpdate(); ' abEY
sm.close(); }?mSMqnB
sm = cn.createStatement("insert into corp...); .cs x"JC
sm.executeUpdate(); @PNgqjd
sm.close(); t`Z3*?UqI
3、提交 t.;._'
cn.commit(); =T2SJ)
4、如果发生异常,那么回滚 aanS^t0
cn.rollback();