java 数据库基本操作 P2RL\`<"
1、java数据库操作基本流程 X1qj
l_A
2、几个常用的重要技巧: .Tqvy)'
可滚动、更新的记录集 v86`\K*0Y
批量更新 zvC,([
事务处理 P>Rqy
{v/6|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 / hdl
1、取得数据库连接 b:I5poI3
1)用DriverManager取数据库连接 0DT2qM[,
例子 3?CpylCO
String className,url,uid,pwd; n:)Y'52}
className = "oracle.jdbc.driver.OracleDriver"; F>R)~;Ja
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; > o`RPWs
uid = "system"; I;Y`rGj
pwd = "manager"; SP1oBR"3
Class.forName(className); v!C+W$,T
Connection cn = DriverManager.getConnection(url,uid,pwd); hd%F7D5
2)用jndi(java的命名和目录服务)方式 y~1php>2f1
例子 ,OAWGFKOp
String jndi = "jdbc/db"; hG3Lj7)UH
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); !Shh$iz
DataSource ds = (DataSource) ctx.lookup(jndi); [6N39G$
Connection cn = ds.getConnection(); gcF><i6
多用于jsp中 bZfJG^3
2、执行sql语句 q8]k]:r
1)用Statement来执行sql语句 swbD q
String sql; 8}@a?QS(&
Statement sm = cn.createStatement(); G<1mj!{Vp
sm.executeQuery(sql); // 执行数据查询语句(select) +q%goG8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); W)O'( D
2)用PreparedStatement来执行sql语句 }epN<DL
String sql; Xxw.{2Ji!q
sql = "insert into user (id,name) values (?,?)"; IDZn,^
PreparedStatement ps = cn.prepareStatement(sql); _zwuK1e
ps.setInt(1,xxx); mn` Ae=
ps.setString(2,xxx); j
pV
... .C?g nOq
ResultSet rs = ps.executeQuery(); // 查询 -3Hq 1
int c = ps.executeUpdate(); // 更新 /% 1lJD
F4Z0g*^x
3、处理执行结果 T+hW9pa)
查询语句,返回记录集ResultSet 5o#8DIal
更新语句,返回数字,表示该更新影响的记录数 d a9 *>+[
ResultSet的方法 ,_O[;L
1、next(),将游标往后移动一行,如果成功返回true;否则返回false R 5zV=N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 VUy
1?n
f#mpd]e+6
4、释放连接 &Y$rVBgQ
cn.close(); en)DN3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection :{2$X|f
3
"'(4l 2.
可滚动、更新的记录集 24fWj?A| ^
1、创建可滚动、更新的Statement !2}Q9a
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); :8g \B{
该Statement取得的ResultSet就是可滚动的 XF6=xD
2、创建PreparedStatement时指定参数 &h-1Z}
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ~gD]JiiA
ResultSet.absolute(9000); <Jz>e}*)
批量更新 HL]?CWtGP
1、Statement fCR;Fk2B
Statement sm = cn.createStatement(); M#m7g4*L !
sm.addBatch(sql1); l?~h_8&fT
sm.addBatch(sql2); G$b4`wt
... DS fKUx&
sm.executeBatch() cjk5><}`H7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 sEa:p:!
2、PreparedStatement <[bDNe["?
PreparedStatement ps = cn.preparedStatement(sql); '`u1,h
{ TXM.,5Dx\
ps.setXXX(1,xxx); [(mq8Nb
... gMbvHlT
ps.addBatch(); 4w,}1uNEf
} (Lp-3Xx
ps.executeBatch(); FW4 hqgE@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "O`;zC
%M`&}'6'
事务的处理 qCMcN<:>
1、关闭Connection的自动提交 \?ZdUY
cn.setAutoCommit(false); gqhW.e}]
2、执行一系列sql语句 7blZAA?-
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @?U5t1O<
Statement sm ; [Zf<r1m
sm = cn.createStatement(insert into user...); @N$r'@
sm.executeUpdate(); )Jc>l;G(M
sm.close(); T-\,r
sm = cn.createStatement("insert into corp...); |w5#a_adM
sm.executeUpdate();
1Sy#*
sm.close(); jL# ak V
3、提交 ]8#{rQ(
cn.commit(); ?/\;K1c p
4、如果发生异常,那么回滚 DEBgb
cn.rollback();