java 数据库基本操作 .CI]8O"3y
1、java数据库操作基本流程 ~/[cZY@
2、几个常用的重要技巧: D>c%5h
可滚动、更新的记录集 133lIX+(k
批量更新 {i^ ?XdM
事务处理 {#q<0l
.D^k0V
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 2U>1-p&dn
1、取得数据库连接 iUA2/ A
1)用DriverManager取数据库连接 /'E+(Y&:J
例子 $${ebt
String className,url,uid,pwd; %kNkDI
className = "oracle.jdbc.driver.OracleDriver"; O<f_-n@G|
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; JU<<,0
uid = "system"; ix^:qw;
pwd = "manager"; yqlkf$?
Class.forName(className); "eI-Y`O,
Connection cn = DriverManager.getConnection(url,uid,pwd); P%pB]d.qpi
2)用jndi(java的命名和目录服务)方式 H` Q_gy5Z(
例子 +Qu~UK\
String jndi = "jdbc/db"; 7H[#
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /.05rTpp
DataSource ds = (DataSource) ctx.lookup(jndi); (W3R3>;
Connection cn = ds.getConnection(); abD55YJY
多用于jsp中 0Qw?.#[9
2、执行sql语句 =DE5Wq19
1)用Statement来执行sql语句 Q(AOKp,F
String sql; 2b1LC!'U
Statement sm = cn.createStatement(); <3HW!7Ad1
sm.executeQuery(sql); // 执行数据查询语句(select) zDa*n:S
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); XnWr~h{b
2)用PreparedStatement来执行sql语句 {FQ
dDIj#
String sql; oX3Q9)
sql = "insert into user (id,name) values (?,?)"; `Lm
ArW:
PreparedStatement ps = cn.prepareStatement(sql); B_`A[0H
ps.setInt(1,xxx); 4OCz:t
ps.setString(2,xxx); Ew4DumI
... RZ|s[bU
ResultSet rs = ps.executeQuery(); // 查询 $q.8ve0&^
int c = ps.executeUpdate(); // 更新 $+JaEF`8
K"Nq_Ddwd
3、处理执行结果 M0c"wi@S_
查询语句,返回记录集ResultSet 5/:Zj,41{
更新语句,返回数字,表示该更新影响的记录数 ]|Vm!Q
ResultSet的方法 L4.yrA-]C%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false XFYCPET
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :BMU c-[
wi*Ke2YKP
4、释放连接 t]eB3)FX
cn.close(); 1ErH \!
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9jaYmY]~
s26s:A3rh
可滚动、更新的记录集 E'[pNU*"x-
1、创建可滚动、更新的Statement 28X)s!W'
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); f`WmRx]K
该Statement取得的ResultSet就是可滚动的 ^ 9;s
nr
2、创建PreparedStatement时指定参数 X~GZI*P
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); &xH>U*c
ResultSet.absolute(9000); }}t"^m s
批量更新 BT d$n!'$n
1、Statement ]N1$ioC#
Statement sm = cn.createStatement(); +t.T+`
EG
sm.addBatch(sql1); A!iH g__/t
sm.addBatch(sql2); gADt%K2#Z
... S)g5Tu)
sm.executeBatch() L=Dx$#|
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 s}|IRDpp
2、PreparedStatement *i5&x/ds
PreparedStatement ps = cn.preparedStatement(sql); P|HY=RMa
{ s_`wLQ7e
ps.setXXX(1,xxx); 7jts;H=
... ( }JX ]-
ps.addBatch(); 22tY%Y9
} U0jq.]P
ps.executeBatch(); BAoqO
Xv
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 5Odi\SJ&
ODv)-J
事务的处理 n6Q 3X
1、关闭Connection的自动提交 cY\-e?`=4
cn.setAutoCommit(false); s)/i_Oe$\
2、执行一系列sql语句 .vpQ3m>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close n)`*{uv$
Statement sm ; {j:{wW.
sm = cn.createStatement(insert into user...); Kn\Oj=4
sm.executeUpdate(); 8l!S<RA
sm.close(); A|RAMO@le
sm = cn.createStatement("insert into corp...); 4Iy\
sm.executeUpdate(); J|6aa
sm.close(); 0pkU1t~9
3、提交 \8Blq5n-O*
cn.commit(); dqF--)Nb
4、如果发生异常,那么回滚 1f[!=p
cn.rollback();