java 数据库基本操作 )F_nK f"a
1、java数据库操作基本流程 ):lH
2、几个常用的重要技巧: u*$]Bx
可滚动、更新的记录集 =K<`nF0w
批量更新 F%IvgXt5
事务处理 F R(k==pZ
hn=tSlte
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 -*$ s ;G#
1、取得数据库连接 B!1h"K5.($
1)用DriverManager取数据库连接 {s>V'+H(F
例子 '81c>qA
String className,url,uid,pwd; G^Va$ike
className = "oracle.jdbc.driver.OracleDriver"; Mp?L9
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; hsHbT^Qm
uid = "system"; 8Dkq+H93
pwd = "manager"; ,lcSJ^yr
Class.forName(className); L6./5`bs
Connection cn = DriverManager.getConnection(url,uid,pwd); xF6byTi
2)用jndi(java的命名和目录服务)方式 =2@V}
例子 tU0jFBB
String jndi = "jdbc/db"; .Ta (v3om%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )&j@ ={0
DataSource ds = (DataSource) ctx.lookup(jndi); 89x;~D1
Connection cn = ds.getConnection(); ?$#P
=VK
多用于jsp中 ;EQ7kuJQ?
2、执行sql语句 x c]#8K
1)用Statement来执行sql语句
<Hr~|oG
String sql; G!+Mu2
Statement sm = cn.createStatement(); $!$,cKPl5
sm.executeQuery(sql); // 执行数据查询语句(select) &dG^ M2g-F
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %-woaj
2)用PreparedStatement来执行sql语句 /2'l=R5#
String sql; A(*c|Aj9
sql = "insert into user (id,name) values (?,?)"; "7Z-ACyF5
PreparedStatement ps = cn.prepareStatement(sql); *x:*Q \|
ps.setInt(1,xxx); mKsJ[)#.
ps.setString(2,xxx); ~REfr}0
... S ,x';"
ResultSet rs = ps.executeQuery(); // 查询 HR;I}J 9
int c = ps.executeUpdate(); // 更新 L'w]O
-86
1Qw_P('}
3、处理执行结果 bXSAZWf
查询语句,返回记录集ResultSet @'<=EAXe
更新语句,返回数字,表示该更新影响的记录数 Mc&Fj1h5
ResultSet的方法 J7Mbv2D
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ey6ujV7!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Zs4NN2~
~jzjJ&O&
4、释放连接 OT0IGsJ"'
cn.close(); 4]#$YehM5
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 7,zE?KG /
G6dUm_iB
可滚动、更新的记录集 6Yl+IP];i
1、创建可滚动、更新的Statement oL~?^`cGZ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Y?$
该Statement取得的ResultSet就是可滚动的 'Y.6sB
2、创建PreparedStatement时指定参数 m(D+!I9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); aS``fE;O
ResultSet.absolute(9000); |`xM45
批量更新 ,m8mh)K?0>
1、Statement p-r[M5;-^Q
Statement sm = cn.createStatement(); 3m| C8:
sm.addBatch(sql1); gD2P)7:
sm.addBatch(sql2); VeSQq
... w+wtr[;wwL
sm.executeBatch() d<6m_!L
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ^GlzKl
2、PreparedStatement bjo}95
PreparedStatement ps = cn.preparedStatement(sql); Nz}PcWF/
{ `FEa(Q+s
ps.setXXX(1,xxx);
[8~P
Pc^
... TbaZFLr
ps.addBatch(); s94*uZ(C/
} 0*_E'0L8e
ps.executeBatch(); ,OERDWW|6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {A'*3(8
>7PNl\=gG
事务的处理 PW82
Vp.
1、关闭Connection的自动提交 Au6Y]
cn.setAutoCommit(false); !6x7^E;c
2、执行一系列sql语句 &B]1 VZUp
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 9VanR
::XX
Statement sm ; :yRv:`r3Lt
sm = cn.createStatement(insert into user...); 2$ &B@\WY
sm.executeUpdate(); lu8*+.V
sm.close(); p{}4#+-<#H
sm = cn.createStatement("insert into corp...); A $ ]s{`
sm.executeUpdate(); Q'qX`K+@`
sm.close(); -QwH|
3、提交 X`1R&K;z^
cn.commit(); T2 S fBs
4、如果发生异常,那么回滚 VFzIBgJ3
cn.rollback();