java 数据库基本操作 gO{$p q}
1、java数据库操作基本流程 85e*um^
2、几个常用的重要技巧: aLl=L_
可滚动、更新的记录集 M@JW/~p'
批量更新 6"?#E[ #[
事务处理 ;d<O/y,:4
Zv2]X-
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 eLLOE)x
1、取得数据库连接 RxS{
1)用DriverManager取数据库连接 lL'Bop@
例子 yuC|_nL
String className,url,uid,pwd; O0;mXH
className = "oracle.jdbc.driver.OracleDriver"; 9oIfSr,y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ?D|kCw69SE
uid = "system"; Apj[z2nr
pwd = "manager"; *pDS%,$xe
Class.forName(className); \r9E6LLX'
Connection cn = DriverManager.getConnection(url,uid,pwd); ^q`RaX)
2)用jndi(java的命名和目录服务)方式 l[i1,4
例子 b6xz\zCL
String jndi = "jdbc/db"; 7nBX@Uo
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8
&v)Vi-
DataSource ds = (DataSource) ctx.lookup(jndi); gW^4@q
Connection cn = ds.getConnection(); tt
CC]
Q
多用于jsp中 cltx(C>
2、执行sql语句 >3*a&_cI=k
1)用Statement来执行sql语句 NB5lxaL
String sql; $d,/(*Y#-
Statement sm = cn.createStatement(); _2)QL
sm.executeQuery(sql); // 执行数据查询语句(select) 6oFA=CjU{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); [:}"MdU'
2)用PreparedStatement来执行sql语句 dWu;F^
String sql; p>f?Rw_
sql = "insert into user (id,name) values (?,?)"; XL9-N?(@
PreparedStatement ps = cn.prepareStatement(sql); LM 1Vsh<
ps.setInt(1,xxx); $e{[fmx
ps.setString(2,xxx); dt>9mF q
... -PU.Uw]
ResultSet rs = ps.executeQuery(); // 查询 |qwx3 hQ?
int c = ps.executeUpdate(); // 更新 @6%7X7m
K`j:F>b
3、处理执行结果 6!USSipn
查询语句,返回记录集ResultSet g3yZi7b5FU
更新语句,返回数字,表示该更新影响的记录数 O4:_c-V2
ResultSet的方法 G{O{
p
1、next(),将游标往后移动一行,如果成功返回true;否则返回false lA;qFXaN>
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 a8G<x<
KfPgj
4、释放连接 HV7f%U
cn.close(); .,U4 ATO
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ra6 }<o
!qHB?]
可滚动、更新的记录集 fU\;\
1、创建可滚动、更新的Statement "zz b`T[8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]m7x&N2
该Statement取得的ResultSet就是可滚动的 VR%*8=
2、创建PreparedStatement时指定参数 +?[s"(
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +EqL|
ResultSet.absolute(9000); J\p-5[E
批量更新 -N6ek`
1、Statement e\f\CMb
Statement sm = cn.createStatement(); Z c#Jb
sm.addBatch(sql1); Sfp-ns32%A
sm.addBatch(sql2); vS[\j
... 4Ss y (gt
sm.executeBatch() !&`\MD>;~R
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2- (}=N
2、PreparedStatement 3+
2&9mm
PreparedStatement ps = cn.preparedStatement(sql); %`\Qtsape
{ rW_cLdh]#
ps.setXXX(1,xxx); {*r!oD!'
... S v#,L8f
ps.addBatch(); :S7[<SwL
} ,2i1 4H
ps.executeBatch(); kA)`i`gt
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8Bh
micU
B[
D
s?:
事务的处理 2R^Eea
1、关闭Connection的自动提交 x9 n(3Oa
cn.setAutoCommit(false); Nez '1
2、执行一系列sql语句 ,^<39ng
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close IG2z3(j
Statement sm ; "(kiMog-
sm = cn.createStatement(insert into user...); Y?zo")
sm.executeUpdate(); ;XlCd[J<
sm.close(); :Z_abKt
sm = cn.createStatement("insert into corp...); -%K}~4J
sm.executeUpdate(); b^()[4M;
sm.close(); >Rb
jdM5K4
3、提交 ~Ga{=OM??
cn.commit(); jqTK7b
4、如果发生异常,那么回滚 v |pHbX
cn.rollback();