java 数据库基本操作 zIo))L
1、java数据库操作基本流程 D\`$
2、几个常用的重要技巧: W;-Qze\D
可滚动、更新的记录集 u%h<5WNh<
批量更新 _+;x4K;
事务处理 z{n=G
S&=B &23T
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 !X.N$0
1、取得数据库连接 GS{9MGl
1)用DriverManager取数据库连接 Ti)n(G9$
例子 R*[ACpxr
String className,url,uid,pwd; Zka;}UL&Q
className = "oracle.jdbc.driver.OracleDriver"; g]ihwm~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =;{S>P!I(t
uid = "system"; Z9sg6M@s
pwd = "manager"; {[9^@k
Class.forName(className); WWO jyj
Connection cn = DriverManager.getConnection(url,uid,pwd); TRq~n7Y7C
2)用jndi(java的命名和目录服务)方式 p5H Mg\hT
例子 *"4<&F
S
String jndi = "jdbc/db"; Rxli;blzi
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); x9ws@=[:
DataSource ds = (DataSource) ctx.lookup(jndi); 0?:ZER v
Connection cn = ds.getConnection(); ]t=>#
多用于jsp中 ry<
P LRN
2、执行sql语句 xxiLi46/
1)用Statement来执行sql语句 'RA[_Z
String sql; =0:hrg+Zgx
Statement sm = cn.createStatement(); ~xJD3Qf
sm.executeQuery(sql); // 执行数据查询语句(select) E+2y-B)E
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z~nl{P#
2)用PreparedStatement来执行sql语句 ?eO|s5r
String sql; 8r|LFuI
sql = "insert into user (id,name) values (?,?)"; <^~F~]wnH
PreparedStatement ps = cn.prepareStatement(sql); 08`
@u4
ps.setInt(1,xxx); @E)XT\;3
ps.setString(2,xxx); {l6]O
... W[?B@ sdSZ
ResultSet rs = ps.executeQuery(); // 查询 dG rA18
int c = ps.executeUpdate(); // 更新 ='JX_U`A^F
~8X'p6
3、处理执行结果 ec0vg.>p
查询语句,返回记录集ResultSet bCrB'&^t
更新语句,返回数字,表示该更新影响的记录数 /Yh([P>
ResultSet的方法 "L)pH@)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ES~]rPVS
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }n=NHHtJ
f65Sr"qB3
4、释放连接 VO`A
cn.close(); J91`wA&r
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection :d#NnR0^L
Kaa*;T![
可滚动、更新的记录集 /f[_]LeV]
1、创建可滚动、更新的Statement 8vRiVJ8QS:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); lrE0)B5F
该Statement取得的ResultSet就是可滚动的 9j"\Lr*o"
2、创建PreparedStatement时指定参数 Z~|J"2.
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); QE gv,J{
ResultSet.absolute(9000); b?$09,{0
批量更新 8j$q%g
1、Statement }cT}G;L'-
Statement sm = cn.createStatement(); 3pp
w_?k
sm.addBatch(sql1); H5AY6),
sm.addBatch(sql2); OS
6 )`
... s7e'9Bx
sm.executeBatch() 6)$_2G%Zq
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <H)@vW]_
2、PreparedStatement >guQY I@4,
PreparedStatement ps = cn.preparedStatement(sql); ah92<'ix
{ yU.0'r5uR
ps.setXXX(1,xxx); -0`hJ_(
... n`,Q:
ps.addBatch(); kUt9'|9!
} Rv-o__C!
ps.executeBatch(); 39j d}]e
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 q{hq. KZ
$T4PC5.
事务的处理 .+|DN"PgJ
1、关闭Connection的自动提交 fh^_=R(/
cn.setAutoCommit(false); O2G+
'
2、执行一系列sql语句 Kv]6 b2HT
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +XE21hb
Statement sm ; ]G B},
sm = cn.createStatement(insert into user...); <@A^C$g
sm.executeUpdate(); ASvPr*q/
sm.close(); 3$8}%?i
sm = cn.createStatement("insert into corp...); ="DgrH
sm.executeUpdate(); f#~Re:7.c
sm.close(); ge[i&,.&z
3、提交 7N"Bbl
cn.commit(); ["}A#cO652
4、如果发生异常,那么回滚 IT(c'}
cn.rollback();