java 数据库基本操作 dMf:h"7
1、java数据库操作基本流程 DCIxRPw
2、几个常用的重要技巧: (C-{B[Y
可滚动、更新的记录集 r3&G)g=u
批量更新 |[<_GQl
事务处理 U@_dm/;0&
EUD~CZhS"k
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,
pDnRRJ!
1、取得数据库连接 5[k/s}g
1)用DriverManager取数据库连接 Xx."$l
例子 :DrWq{4
String className,url,uid,pwd; nBjqTud
className = "oracle.jdbc.driver.OracleDriver"; [R(`W#W
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ]HKQDc'
uid = "system"; OE_XCZ!5P
pwd = "manager"; ?26I,:;
Class.forName(className); A!s`[2 Z
Connection cn = DriverManager.getConnection(url,uid,pwd); n7B7 m,@1
2)用jndi(java的命名和目录服务)方式 $2oTkOA
例子 "bFTk/
String jndi = "jdbc/db"; &gVN&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); we~[ ]
\
DataSource ds = (DataSource) ctx.lookup(jndi); H*RC@O_hv
Connection cn = ds.getConnection(); 0%9 q8M;
多用于jsp中 zT=Ho
2、执行sql语句 :~b3^xhc^
1)用Statement来执行sql语句 lGPUIoUo
String sql; Bn=by{i
Statement sm = cn.createStatement(); .0S~872
sm.executeQuery(sql); // 执行数据查询语句(select) Uol|9F
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 1n >X[!
8x
2)用PreparedStatement来执行sql语句 AF;)#T<
String sql; rn/ /%
sql = "insert into user (id,name) values (?,?)"; <r.)hT"0
PreparedStatement ps = cn.prepareStatement(sql); bR*-Ht+wd
ps.setInt(1,xxx); lP[w?O
ps.setString(2,xxx); Y}t \4 di
... 1tEgl\u\
ResultSet rs = ps.executeQuery(); // 查询 9_# >aOqL
int c = ps.executeUpdate(); // 更新 7`-Zuf
J`peX0Stl
3、处理执行结果 3 R=,1<
查询语句,返回记录集ResultSet ypbe!Y<i]
更新语句,返回数字,表示该更新影响的记录数 m!|kW{B#A
ResultSet的方法 5L+>ewl
1、next(),将游标往后移动一行,如果成功返回true;否则返回false oRm L
{UDZ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 -V-RP;">
[.O?Z=5a[V
4、释放连接 iZ#!O*>
cn.close(); ]{)a,c NG
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection aGrIQq/k)%
Ttu2 skcv
可滚动、更新的记录集 p#ol*m5wE
1、创建可滚动、更新的Statement hv`~?n)D66
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;+W#5<i
该Statement取得的ResultSet就是可滚动的 u!!Y=!y*<
2、创建PreparedStatement时指定参数 H{@Yo\J
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #o=y?(
ResultSet.absolute(9000); b(*!$EB
批量更新 s[M?as
1、Statement a=1NED'
Statement sm = cn.createStatement(); }\z.)B4,
sm.addBatch(sql1); nGpXI\K
sm.addBatch(sql2); T}Km?d
... X\]L=>]C
sm.executeBatch() ZOft.P O
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 In:9\7~jC
2、PreparedStatement mPOGidxix
PreparedStatement ps = cn.preparedStatement(sql); K$&s=Hm
{ ~x A-V4.
ps.setXXX(1,xxx); o9|nJ;
... wF
IegC(
ps.addBatch(); q$ZHd
} G 3+.H
ps.executeBatch(); "9m2/D`=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ^WHE$4U`
o>).Cj
事务的处理 @E;=*9ek{u
1、关闭Connection的自动提交 RTvqCp
cn.setAutoCommit(false); HTVuStM8
2、执行一系列sql语句 *i\Qo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close S/}2; \Xm
Statement sm ; gwOa$f%O
sm = cn.createStatement(insert into user...); E=jNi
sm.executeUpdate(); 8qY79)vD4E
sm.close(); %b%-Ogz;4
sm = cn.createStatement("insert into corp...); >z/#_z@LV
sm.executeUpdate(); r;B8i!gD
sm.close(); I(]}XZq
3、提交 J@^8ko
cn.commit(); =+/eLKG
4、如果发生异常,那么回滚 88VZR&v
cn.rollback();