java 数据库基本操作 <F=Dj*]
1、java数据库操作基本流程 ek[kq[U9
2、几个常用的重要技巧: Lht[g9
可滚动、更新的记录集 p^8JLC
批量更新 ]
C,1%(
事务处理 6wpU6NU
b}%g}L D
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 >Me]m<$E;
1、取得数据库连接
5T/J%
1)用DriverManager取数据库连接 y[:q"BB3
例子 ny`(f,)u*
String className,url,uid,pwd; &r:m&?!|VQ
className = "oracle.jdbc.driver.OracleDriver"; [EGx
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; l<2oklo5
uid = "system"; pb$fb
pwd = "manager"; gPUo25@pn*
Class.forName(className); m;h<"]<
Connection cn = DriverManager.getConnection(url,uid,pwd); |yAK@Hl'
2)用jndi(java的命名和目录服务)方式 9-G b"hr
例子 B+Q+0tw*i
String jndi = "jdbc/db"; =xBT>h;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); hwDXm9
DataSource ds = (DataSource) ctx.lookup(jndi); p!GZCf,
Connection cn = ds.getConnection(); MOyT< $
多用于jsp中 k ZK//YN#
2、执行sql语句 [` 'd#pR
1)用Statement来执行sql语句 ?48AY6
String sql; !
IgoL&=
Statement sm = cn.createStatement(); K_##-6>
sm.executeQuery(sql); // 执行数据查询语句(select) H56
^n<tg
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %uEtQh[
2)用PreparedStatement来执行sql语句 .\)k+ R
String sql; qsvpW%?aE
sql = "insert into user (id,name) values (?,?)"; OT+ Ee
PreparedStatement ps = cn.prepareStatement(sql); i7f%^7!
ps.setInt(1,xxx); fqX~xp
ps.setString(2,xxx); *')Q {8`
... A^cU$V%?W
ResultSet rs = ps.executeQuery(); // 查询 B<+pg
int c = ps.executeUpdate(); // 更新 bqjr0A7{
,|iy1yg(
3、处理执行结果 jnDQ{D
查询语句,返回记录集ResultSet q\U4n[Zk
更新语句,返回数字,表示该更新影响的记录数 }Eb]9c\
ResultSet的方法 ^vn\4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false fD(7FN8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .ujj:>
|>@-grs
4、释放连接 mo*'"/
cn.close(); `+^sW#ki
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 4
iKR{P6
I<xy?{s
可滚动、更新的记录集 qM*S*,s
1、创建可滚动、更新的Statement .d
e
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); IW] *i?L
该Statement取得的ResultSet就是可滚动的 YJc%h@ _=]
2、创建PreparedStatement时指定参数 '&)D>@g
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); NZ)b:~a
ResultSet.absolute(9000); &PSTwZd
批量更新 yP%o0n/"x
1、Statement 55,=[
Statement sm = cn.createStatement(); 2x6<8J8v*
sm.addBatch(sql1);
Lxz
sm.addBatch(sql2); :4iU^6
... 7y;u} 1
sm.executeBatch() yIa[yJq
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 nIR*_<ow
2、PreparedStatement +h|K[=l\
PreparedStatement ps = cn.preparedStatement(sql); E\_W
{ v}f&q!
ps.setXXX(1,xxx); bk0Y
... lc"qqt
ps.addBatch(); 2pjW,I!`
} h*G#<M
ps.executeBatch(); `LE^:a:8,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )X~#n
AX8gij
事务的处理 ^A- sS~w
1、关闭Connection的自动提交 u2\+?`Ox
cn.setAutoCommit(false);
*[VEF
2、执行一系列sql语句 @Mzz2&(dU
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ]u;GNz}?
Statement sm ; 9E^~#j@Zr
sm = cn.createStatement(insert into user...); 6TY){Pw
sm.executeUpdate(); |GuKU!
sm.close(); L)1C'8).
sm = cn.createStatement("insert into corp...); YN4"O>
sm.executeUpdate(); qP qy4V.;
sm.close(); #jhQBb4?,
3、提交 jT{f<P0
cn.commit(); Q6eN+i2 ;
4、如果发生异常,那么回滚 =?wMESU
cn.rollback();