java 数据库基本操作 %7hB&[ 5
1、java数据库操作基本流程 4~z?"
2、几个常用的重要技巧: ?BA^YF
可滚动、更新的记录集 PX(pX>
批量更新 8|Y.|\
事务处理 "YU{Fkl#j
|=a}iU8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 &o3K%M;C?
1、取得数据库连接 BxK^?b[E8
1)用DriverManager取数据库连接 lb*8G
例子 ww k
P F
String className,url,uid,pwd; KvPX=/&Zu
className = "oracle.jdbc.driver.OracleDriver"; up'
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; BV`- =wRC
uid = "system"; a4i:|
pwd = "manager"; h*B|fy4K9U
Class.forName(className); !ZRs;UZ>o
Connection cn = DriverManager.getConnection(url,uid,pwd); sZ<9A Xk-E
2)用jndi(java的命名和目录服务)方式 CjIu[S1%
例子 ]rN5Ao}2
String jndi = "jdbc/db"; `Y=WMNy
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *i{Y 9f8
DataSource ds = (DataSource) ctx.lookup(jndi); f.B>&%JRZ
Connection cn = ds.getConnection(); clw%B
多用于jsp中 A"5z6A4WB
2、执行sql语句 9@ 16w
1)用Statement来执行sql语句
9Z5D\yv?H
String sql; #-% A[7Cdp
Statement sm = cn.createStatement(); (b,[C\RBF
sm.executeQuery(sql); // 执行数据查询语句(select) W5L iXM
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); &sXRN&Fp
2)用PreparedStatement来执行sql语句 4)>FS'=
String sql; s@hRqGd:
sql = "insert into user (id,name) values (?,?)"; G rmzkNlN
PreparedStatement ps = cn.prepareStatement(sql); :!a2]-D}
ps.setInt(1,xxx); wCf~O'XLw
ps.setString(2,xxx); YwY74w:
... [+m?G4[
ResultSet rs = ps.executeQuery(); // 查询 :,b
iyJt
int c = ps.executeUpdate(); // 更新 {gNV[45
r|e-<t4.9L
3、处理执行结果 D]a <4a18
查询语句,返回记录集ResultSet !\8 ;d8
更新语句,返回数字,表示该更新影响的记录数 VQ5nq'{v
ResultSet的方法 73#x|lY
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [YrHA~=U
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %1 vsN-O}8
G0O#/%%
4、释放连接 Vm}%ttTC
cn.close(); mI*[>#q>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection oh"O07
65h @}9,U
可滚动、更新的记录集 `Q3s4VEC
1、创建可滚动、更新的Statement l!}:|N Yh!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); v:Tzv^
该Statement取得的ResultSet就是可滚动的 U7uKRv9
2、创建PreparedStatement时指定参数 vx_o(wof
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 4'4\,o
ResultSet.absolute(9000); iy.2A!f^.
批量更新 ,lA.C%4au~
1、Statement $N:Vo(*
Statement sm = cn.createStatement(); N,2s?Y_!
sm.addBatch(sql1); yme^b
;a
sm.addBatch(sql2); {!|}=45Z
...
z@|GC_L
sm.executeBatch() ;,i]w"*
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 i
wxVl)QL
2、PreparedStatement ~8"8w(CG*I
PreparedStatement ps = cn.preparedStatement(sql); ay "'#[
{ r<F hY
ps.setXXX(1,xxx); R8rfM?"W
... {~|OE-X][
ps.addBatch(); Ev7J+TmXM
} mWR4|1(
ps.executeBatch(); o9xlu.QL{c
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2aJS{[
p ~noM/*2r
事务的处理 :1t~[-h^
1、关闭Connection的自动提交 3d<HN6&U
cn.setAutoCommit(false); L-B<nl
2、执行一系列sql语句 .s+aZwTMT
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close |#1(Z-}
Statement sm ; / XnhmqWm%
sm = cn.createStatement(insert into user...); qd8n2f
sm.executeUpdate(); 1+-_s
sm.close(); +xc'1id@[
sm = cn.createStatement("insert into corp...); 7eWk7&Xul
sm.executeUpdate(); 9j W2
sm.close(); qd"_Wu6aF=
3、提交 s Y?,0T_m
cn.commit(); J!'@ Bd
4、如果发生异常,那么回滚 yV_4?nh
cn.rollback();