java 数据库基本操作 X%35XC.n
1、java数据库操作基本流程 ~q5-9{ma
2、几个常用的重要技巧: a(g$ d2H
可滚动、更新的记录集 k$?&]! <o
批量更新 !yk7HaP
事务处理 X`tOO
sFD!7;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <EOg,"F
1、取得数据库连接 IwnYJp:9v
1)用DriverManager取数据库连接 Ta,u-!/I
例子 B
;;cbY
String className,url,uid,pwd; P$F#,Cn
className = "oracle.jdbc.driver.OracleDriver"; =^"~$[z(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +:b(%|
uid = "system"; LP8o7%sv!
pwd = "manager"; p0?o<AA%O
Class.forName(className); AV9:O{
Connection cn = DriverManager.getConnection(url,uid,pwd); P)4x
2)用jndi(java的命名和目录服务)方式 89ZDOji?O
例子 XuA0.b%
String jndi = "jdbc/db"; e ^-3etx
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ul}4p{ m[
DataSource ds = (DataSource) ctx.lookup(jndi); ^Y#@$c
Connection cn = ds.getConnection(); tvK rc
多用于jsp中 ,%.:g65%
2、执行sql语句 d7\k gh
1)用Statement来执行sql语句 ;q'DGzh
String sql; y K=S!7p\
Statement sm = cn.createStatement(); C!`>cUhE{
sm.executeQuery(sql); // 执行数据查询语句(select) c;nx59w]q
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); EGr|BLl
2)用PreparedStatement来执行sql语句 i<0D
Z_rub
String sql; ~ }Kp
sql = "insert into user (id,name) values (?,?)";
%L{
PreparedStatement ps = cn.prepareStatement(sql); ]kzv8#
ps.setInt(1,xxx); aKaR
ps.setString(2,xxx); 1+VY><=n
... B?!9W@
ResultSet rs = ps.executeQuery(); // 查询 .$n$%|"H-
int c = ps.executeUpdate(); // 更新 w
5!ndu
aViJ
3、处理执行结果 4|I7:~
查询语句,返回记录集ResultSet |qQ{ 8T%)
更新语句,返回数字,表示该更新影响的记录数 ^7J~W'hI
ResultSet的方法 xNocGtS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false c&0;wgieg
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 t*5z1T?
@G7w(>_T3
4、释放连接 QZ6[*_Z6
cn.close(); YLD-SS[/>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection G* 8+h
cA2^5'$$
可滚动、更新的记录集 'nC3:U
1、创建可滚动、更新的Statement wE-Ji<1HJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); O-y6!u$6&
该Statement取得的ResultSet就是可滚动的 ?r^
hmu"a
2、创建PreparedStatement时指定参数 >Iu]T{QNO
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u4`mQ6
ResultSet.absolute(9000); +R3\cRM
批量更新 (rau8
1、Statement <W=~UUsn
Statement sm = cn.createStatement(); K'a#M g
sm.addBatch(sql1); 49iR8w?k
sm.addBatch(sql2); *1 n;p)K
... VyB\]EBu
sm.executeBatch() |)
x'
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4Z<]4:o
2、PreparedStatement Kx(76_XD
PreparedStatement ps = cn.preparedStatement(sql); z"
b/osV
{ %AzPAWcN
ps.setXXX(1,xxx); V:nMo2'hb
... H={O13
ps.addBatch(); n1fEdaa7g
} #rSasucr
ps.executeBatch(); 61ON
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @&!=m]D*
U)O?|
VN^o
事务的处理 Gp?ToS2^d
1、关闭Connection的自动提交 ,6S_&<{
cn.setAutoCommit(false); o|zrD~&$
2、执行一系列sql语句 JL}hOBqfI
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {mCKTyN+
Statement sm ; (M+,wW[6
sm = cn.createStatement(insert into user...); 8MYLXW6
sm.executeUpdate(); zgEr ,nF
sm.close(); vkDZv@
sm = cn.createStatement("insert into corp...); GoGohsj
sm.executeUpdate(); <M5{.`o
sm.close(); jsZiARTZRl
3、提交 =;'ope(?S
cn.commit(); F[o+p|nF
4、如果发生异常,那么回滚 ,yB?~
cn.rollback();