java 数据库基本操作 #\QC%"%f
1、java数据库操作基本流程 _>I5Ud8(-
2、几个常用的重要技巧: TXv#/@
可滚动、更新的记录集 UPF=X)!M
批量更新 r>o6}Mx$
事务处理 G=e[TR)i
y
6<tV.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 \PJ89u0
1、取得数据库连接 /.bwwj_;
1)用DriverManager取数据库连接 ;GSj}Nq
例子 jRc#>;dN
String className,url,uid,pwd; |n8^Xsx4w
className = "oracle.jdbc.driver.OracleDriver"; ~~mQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; pDQ,v"
uid = "system"; e+U o-CO
pwd = "manager"; *fZ'#C~x
Class.forName(className); va<pHSX&I@
Connection cn = DriverManager.getConnection(url,uid,pwd); )1le- SC
2)用jndi(java的命名和目录服务)方式 IZLX[y
例子 j/&7L@Y
String jndi = "jdbc/db"; J.d<5`7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); zT"#9"["
DataSource ds = (DataSource) ctx.lookup(jndi); >{Djx
Connection cn = ds.getConnection(); }$jIvb,3?
多用于jsp中 IT|CfQ [D
2、执行sql语句 3@*8\
1)用Statement来执行sql语句 Xob##{P3
String sql; ]LjW,b"
Statement sm = cn.createStatement(); /2 (F
sm.executeQuery(sql); // 执行数据查询语句(select) A[MEtI=Q J
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;7}*Xr|
2)用PreparedStatement来执行sql语句 zF7T5Ge
String sql; PR0]:t)E
sql = "insert into user (id,name) values (?,?)"; %VCHM GP=
PreparedStatement ps = cn.prepareStatement(sql); gC.T5,tn
ps.setInt(1,xxx); T=vI'"w
ps.setString(2,xxx); :O2N'vl47A
... KC'{>rt7
ResultSet rs = ps.executeQuery(); // 查询 vHmn)d1pl
int c = ps.executeUpdate(); // 更新 PQ" Dl=,
I6+5 mv\
3、处理执行结果 t [f]
查询语句,返回记录集ResultSet zQ~nS
更新语句,返回数字,表示该更新影响的记录数 p{U ro!J,K
ResultSet的方法 90a=
39kI
1、next(),将游标往后移动一行,如果成功返回true;否则返回false n7vi@^lf(
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 FsjblB3?E
G8VWx&RE
4、释放连接 7-)KTBFL
cn.close(); E@p9vf->
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection oID,PB*9
^<c?I re
可滚动、更新的记录集 H`sV\'`!}
1、创建可滚动、更新的Statement e8Jd*AKjb
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Em;zi.Y+V
该Statement取得的ResultSet就是可滚动的 38F8(QU{
2、创建PreparedStatement时指定参数 kq+L63fZ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); bA:abO
ResultSet.absolute(9000); }/=_
批量更新 p)`JVq,H/B
1、Statement HzV3O-Qz]
Statement sm = cn.createStatement(); raCxHY
sm.addBatch(sql1); 8Pq|jK "
sm.addBatch(sql2); mSs%g L]g
... \O56!,k
sm.executeBatch() B4%W,F:@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 /1YqDK0
2、PreparedStatement N]3XDd|q
PreparedStatement ps = cn.preparedStatement(sql); I?gbu@o
{ ;-59#S&?tB
ps.setXXX(1,xxx); umY4tNe]$
... &0'BCT
ps.addBatch(); WE\V<MGS/
} kAMt8
ps.executeBatch(); ]'{<O3:7
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3LG)s:p$/
BO^e.iB/
事务的处理 C
7v
8
1、关闭Connection的自动提交 V<b"jCXI
cn.setAutoCommit(false); HQ"D>hsuU
2、执行一系列sql语句
Re`= B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close r>Vgo):s
Statement sm ; W1 E((2
sm = cn.createStatement(insert into user...); q*>`HTPcU
sm.executeUpdate(); ~e|~c<!z8@
sm.close(); ."${.BPn~
sm = cn.createStatement("insert into corp...); 6H@=O1W
sm.executeUpdate(); K:mb$YJ&
sm.close();
W<t,Ivg
3、提交 Y`%:hvy~
cn.commit(); b1-JnEc
4、如果发生异常,那么回滚 h-V5&em"_
cn.rollback();