java 数据库基本操作 Qt|c1@J
1、java数据库操作基本流程 `"%T=w
2、几个常用的重要技巧: 4
B*0M
可滚动、更新的记录集 xLx]_R()
批量更新 7'OtruJ
事务处理 4b:s<$TZ
2B,] -Mu)
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 dx;k`r$w
1、取得数据库连接 +iI&c
s
1)用DriverManager取数据库连接 qc-mGmom L
例子 OQ9x*TmK
String className,url,uid,pwd; M,ir`"s
className = "oracle.jdbc.driver.OracleDriver"; C:G8c[
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @^uH`mc
uid = "system"; 8uA,iYD
pwd = "manager"; ]THPSw_y8
Class.forName(className); Z{H5oUk
Connection cn = DriverManager.getConnection(url,uid,pwd); bGorH=pb5R
2)用jndi(java的命名和目录服务)方式 t='# |');
例子 f3UXCp
String jndi = "jdbc/db"; hHDOWHWE
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); c2K:FdB
DataSource ds = (DataSource) ctx.lookup(jndi); g(#f:"
Connection cn = ds.getConnection(); `SVmQSwO[
多用于jsp中 `)QCn<
2、执行sql语句 z)uuxNv[R
1)用Statement来执行sql语句 uPniLx\t:
String sql; Y[ N^p#t{
Statement sm = cn.createStatement(); lSH6>0#B
sm.executeQuery(sql); // 执行数据查询语句(select) vVE7fq3
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Kt(-@\)!
2)用PreparedStatement来执行sql语句 t-LG }nv
String sql; oTT7M`P3h
sql = "insert into user (id,name) values (?,?)"; _sbp6ZO_
PreparedStatement ps = cn.prepareStatement(sql); ,6r{VLN
ps.setInt(1,xxx); B*E2.\~
ps.setString(2,xxx); i<(Xr
... n#=o?!_4
ResultSet rs = ps.executeQuery(); // 查询 Oez>X=Xf
int c = ps.executeUpdate(); // 更新 T,$WlK
Wj
&hk-1y9QS
3、处理执行结果 F-*2LMe
查询语句,返回记录集ResultSet 1@lJonlF
更新语句,返回数字,表示该更新影响的记录数 z.}[m,oTF
ResultSet的方法 vp.ZK[/`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false O-4C+?V
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 r:]1O*
@9&P~mo/
4、释放连接 Y \:0Ev
cn.close(); HEGKX]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection P bQk<"J1
PdVfO8-
可滚动、更新的记录集 GHmv}
Z
1、创建可滚动、更新的Statement c,*9K/:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ?)\a_Tn
该Statement取得的ResultSet就是可滚动的 ,()0'h}n
2、创建PreparedStatement时指定参数 y1/o^d+@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); r0m*5rd1
ResultSet.absolute(9000); @}:uu$OH
批量更新 j;Z?WXWDh
1、Statement bz|
D-.
Statement sm = cn.createStatement(); [g2;N,V#
sm.addBatch(sql1); `ImE% r!
sm.addBatch(sql2); 'fL"txW
... 5MSB dO
sm.executeBatch() ce6__f5?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 C R|lt
2、PreparedStatement ,$eK-w
PreparedStatement ps = cn.preparedStatement(sql); <`0h|m'U
{ i9=&;_z
ps.setXXX(1,xxx); $O^v]>h
... ./$cMaDJ
ps.addBatch(); fJWC)E
} F9*g=
ps.executeBatch(); p7H3J?`w1+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 5cWw7V<m
=v*.p=r
事务的处理 PH{_,X
1、关闭Connection的自动提交 [ib P%xb
cn.setAutoCommit(false); %N#%|2B
2、执行一系列sql语句 $Q*<96M
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close />j';6vi
Statement sm ; eW>3XD4
sm = cn.createStatement(insert into user...); XerbUkZ
sm.executeUpdate(); 95<EN(oUD
sm.close(); %2V-~.Ro6
sm = cn.createStatement("insert into corp...); Rml2"9"`
sm.executeUpdate();
RDtU43
sm.close(); Q#IG;
3、提交 `~X!Ll
cn.commit(); " ZX3sfkh
4、如果发生异常,那么回滚 Sc7U|s
cn.rollback();