java 数据库基本操作 QYB66g:
1、java数据库操作基本流程 WR:I2-1
2、几个常用的重要技巧: _|^cudRv
可滚动、更新的记录集 1iLrKA
批量更新 hiT&QJB` _
事务处理 b+/z,c6w
bz'#YM
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7cMHzhk^
1、取得数据库连接 ;rj|>
1)用DriverManager取数据库连接 5Z]]xR[
例子 6B8gMO
String className,url,uid,pwd; ,SV34+(
className = "oracle.jdbc.driver.OracleDriver"; .X.,.vHx
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @sPuc.
uid = "system"; %3kS;AaA
pwd = "manager"; V'M#."Of/
Class.forName(className); %96l(JlJ)B
Connection cn = DriverManager.getConnection(url,uid,pwd); 9YQYg@+R
2)用jndi(java的命名和目录服务)方式 r,8~qHbOT
例子 S4O'N x
String jndi = "jdbc/db"; 9]4 W
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K| w\KX0
DataSource ds = (DataSource) ctx.lookup(jndi); G2 {R5F !
Connection cn = ds.getConnection(); `fM]3]x>
多用于jsp中 jt?DogYx
2、执行sql语句 qK-\`m
1)用Statement来执行sql语句 -]~KQvIH!
String sql; 4
Q<c I2|
Statement sm = cn.createStatement(); jCK 0+,;
sm.executeQuery(sql); // 执行数据查询语句(select) LW#$%}
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !kQJ6U
2)用PreparedStatement来执行sql语句 ;N?raz2mEi
String sql; '_fj:dy
sql = "insert into user (id,name) values (?,?)"; .~AQxsGH
PreparedStatement ps = cn.prepareStatement(sql); /w/um>>K.
ps.setInt(1,xxx); #+ai G52+
ps.setString(2,xxx); crlCN
... /D~MHO{
ResultSet rs = ps.executeQuery(); // 查询 W*WSjuFr2
int c = ps.executeUpdate(); // 更新 8#h~J>u.
jccSjGX@w
3、处理执行结果 =N^j:t
查询语句,返回记录集ResultSet :pw6#yi8`
更新语句,返回数字,表示该更新影响的记录数 ~{00moN"m
ResultSet的方法 w:3CWF4q]
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ?'/#Gt`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 oR@1/lV
f+V^q4
4、释放连接 {^A,){uX]
cn.close(); bH`r=@.:cu
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection j21>\K!p
p%#=OtkC
可滚动、更新的记录集 Sau?Y
1、创建可滚动、更新的Statement c 4
bo
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); UZ-[vD1n
该Statement取得的ResultSet就是可滚动的 p/ au.mc
2、创建PreparedStatement时指定参数 QdK
PzjA
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 9Ac4'L
ResultSet.absolute(9000); ,cFBLj(@
批量更新 fqm-?vy}
1、Statement DTN)#GCtF
Statement sm = cn.createStatement(); m
?#WQf
sm.addBatch(sql1); #McX
sm.addBatch(sql2); X*<
!_3
... Lgrpy
sm.executeBatch() 7OdJ&Gzd
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 qk_YFR?R
2、PreparedStatement LA4,o@V`
PreparedStatement ps = cn.preparedStatement(sql); uZXG"
{ U}c05GiQw
ps.setXXX(1,xxx); `7
3I}%?
... ;.I,R NM
ps.addBatch(); Q=?YY-*$
} Gq =i-I
ps.executeBatch(); =v6qr~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 kn= fW1
XGSgx
事务的处理 ]EfM;'j[
1、关闭Connection的自动提交 %mNd9 ]<
cn.setAutoCommit(false); b@ OF
2、执行一系列sql语句 It8s#o q8
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close `2a7y]?
Statement sm ; PNRZUZ4Z|
sm = cn.createStatement(insert into user...); (dHil#l
sm.executeUpdate(); I.{%e;Reg
sm.close(); 0}wmBSl
sm = cn.createStatement("insert into corp...); 5NN`tv
sm.executeUpdate(); 4%>2>5
sm.close(); Rd,5&X$
3、提交 R=<uf:ca
cn.commit(); qs3V2lvYw{
4、如果发生异常,那么回滚 ,Wlw#1fP
cn.rollback();