java 数据库基本操作 Ms:KM{T0
1、java数据库操作基本流程 #JL&]Z+X6
2、几个常用的重要技巧: _'!N q
可滚动、更新的记录集 L876$
批量更新 $ ]W[y=
事务处理 LsJs Q
h
yN 9$gfJC^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <OR.q
1、取得数据库连接 `W"a!,s2
1)用DriverManager取数据库连接 ;#Jq$v)D
例子 J.bFv/R
String className,url,uid,pwd; 0<]$v"`I
className = "oracle.jdbc.driver.OracleDriver"; 4; BW
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @4/~~
uid = "system"; u [V4OU}%
pwd = "manager"; fqcU5l[v,
Class.forName(className); !paN`Fz\a
Connection cn = DriverManager.getConnection(url,uid,pwd); 9?u9wuH
2)用jndi(java的命名和目录服务)方式 i"%JFj_G
例子 %uGleY]~
String jndi = "jdbc/db"; wO^$!zB W
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); z'?7]C2b
DataSource ds = (DataSource) ctx.lookup(jndi); :LZ-da"QR
Connection cn = ds.getConnection(); saGRP}7?
多用于jsp中 -TzI>Fz
2、执行sql语句 hsTFAfa'
1)用Statement来执行sql语句 )myf)"l5
String sql; o,S!RG&
Statement sm = cn.createStatement(); !dfS|BA]
sm.executeQuery(sql); // 执行数据查询语句(select) !Qv5"_
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]>
nPqL
2)用PreparedStatement来执行sql语句 ruZYehu1W
String sql; 94~"U5oQ:
sql = "insert into user (id,name) values (?,?)"; 4*0:bhhhf_
PreparedStatement ps = cn.prepareStatement(sql); H!u nIy|
ps.setInt(1,xxx); M|/oFV
ps.setString(2,xxx); Np.no$_
... ZB~l2
ResultSet rs = ps.executeQuery(); // 查询 rnnX|}J
int c = ps.executeUpdate(); // 更新 "%{,T
q%OcLZ<,
3、处理执行结果 4t&gW
查询语句,返回记录集ResultSet >EBZ$ X
更新语句,返回数字,表示该更新影响的记录数 0n4g$JK7
ResultSet的方法 x`]Ofr'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false +<pVf%u5
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 nGq]$h
Ef2Yl
4、释放连接 %*$5!;
cn.close(); Wyy^gJl
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection wVx,JL5Jr
NFB*1_m
可滚动、更新的记录集 ;M}itM
1、创建可滚动、更新的Statement b->eg 8|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1pd 9s8CA
该Statement取得的ResultSet就是可滚动的 lemVP'cn
2、创建PreparedStatement时指定参数 pTcbq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); h7bPAW=(
ResultSet.absolute(9000); EfFz7j&X
批量更新 ;$vLq&(}
1、Statement }czsa_
Statement sm = cn.createStatement(); xU@1!%l@
sm.addBatch(sql1); _,DO~L
sm.addBatch(sql2); gzVtxDh
... S4L-/<s[*
sm.executeBatch() 1)$%Jr
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Kb^>X{
2、PreparedStatement 7sXy`+TZ->
PreparedStatement ps = cn.preparedStatement(sql); j'3j}G%\T
{ }P#Vsqe V
ps.setXXX(1,xxx); J4YT)-
... qOW#Q:T
ps.addBatch(); t:\l&R&
} _~tm7o+js
ps.executeBatch(); FXS^^p
P
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 cb+l"FI7
uCw>}3
事务的处理 RG&I\DTyt
1、关闭Connection的自动提交 Dt
W*n1Bt
cn.setAutoCommit(false); `&7mHa61
2、执行一系列sql语句 /r276Q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -7k[Vg?
Statement sm ; wAw42{M
sm = cn.createStatement(insert into user...); ^uia`sOP4
sm.executeUpdate(); },rav]
sm.close(); e,EK,,iY5
sm = cn.createStatement("insert into corp...); (@+h5@J[`I
sm.executeUpdate(); 1hR
(N
sm.close(); OFL|RLiD
3、提交 o*X]b]
cn.commit(); $50\"mo~z
4、如果发生异常,那么回滚 +fM&su=wl
cn.rollback();