java 数据库基本操作 '"Uhw$#t
1、java数据库操作基本流程 LrdED[Z
2、几个常用的重要技巧: @v&P;=lU
可滚动、更新的记录集 ryzNM3
批量更新 iSOyp\E|
事务处理 _XT;
2Gj)fMK38
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 _@)-#7
1、取得数据库连接 ^u90N>Dvq
1)用DriverManager取数据库连接 k]-Q3V
例子 4;32f`
String className,url,uid,pwd; c*<BU6y
className = "oracle.jdbc.driver.OracleDriver"; hc]p^/H
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; T_wh)B4xW
uid = "system"; )iC@n8f7o
pwd = "manager"; m%;LJ~R
Class.forName(className); <f)T*E^5%
Connection cn = DriverManager.getConnection(url,uid,pwd); D\J.6W
2)用jndi(java的命名和目录服务)方式 x<w-j[{k_K
例子 6e.l#
c!1}
String jndi = "jdbc/db"; 7z\#"~(.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |G/)<1P
DataSource ds = (DataSource) ctx.lookup(jndi); 3
Sf':N`u
Connection cn = ds.getConnection(); O\=Zo9(NHF
多用于jsp中 1x##b[LC
2、执行sql语句 C^_m>H3b
1)用Statement来执行sql语句 (*vBpJyz%
String sql; plr3&T~,&S
Statement sm = cn.createStatement(); b
ettOg
sm.executeQuery(sql); // 执行数据查询语句(select) &N/dxKZcc
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); M= 3w
2)用PreparedStatement来执行sql语句 iW9
String sql; 5TeGdfu @
sql = "insert into user (id,name) values (?,?)"; rkdA4'66w
PreparedStatement ps = cn.prepareStatement(sql); M djxTr^
ps.setInt(1,xxx); N<KsQsy=
ps.setString(2,xxx); `|92!Ej
... ;1_3E2E$
ResultSet rs = ps.executeQuery(); // 查询 Fwvc+ a
int c = ps.executeUpdate(); // 更新 !"E/6z2&(k
9G7Br s:
3、处理执行结果 Bz%wV-
查询语句,返回记录集ResultSet m9c`"!
更新语句,返回数字,表示该更新影响的记录数 $Dv5TUKw
ResultSet的方法 ^rY18?XC+:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false OYmutq
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]70ZerQ~L
n8\88d
4、释放连接 tK# /S+l
cn.close(); '4M; ;sKW
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection WD kE
5
i>-#QKqJ
可滚动、更新的记录集 .>}Z3jUrf
1、创建可滚动、更新的Statement #tw_`yh
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); bl10kI:F
该Statement取得的ResultSet就是可滚动的 ?y"M>#
2、创建PreparedStatement时指定参数 `q | )_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); hc9ON&L\>
ResultSet.absolute(9000); jWvi%Iqi
批量更新 xd"+ &YT
1、Statement N<Ym&$xR
Statement sm = cn.createStatement(); L0{[L
sm.addBatch(sql1); ) 3f\H
sm.addBatch(sql2); q^ &r<i
... z/WGL
sm.executeBatch() X -=M>H^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 u35"oLV6}#
2、PreparedStatement Ff
=%eg]
PreparedStatement ps = cn.preparedStatement(sql); VKlC`k8L
{ ]vV)$xMX
ps.setXXX(1,xxx); Q$k#q<+0
... B
o%Sl
ps.addBatch(); 1TGE>HG
} w7q6v>
ps.executeBatch(); E1w8d4P,G
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 c7[Ba\Cr4h
zR/mz) 6_
事务的处理 ~oK0k_{~
1、关闭Connection的自动提交 g2M1zRm;
cn.setAutoCommit(false); zqQ[uO]m?
2、执行一系列sql语句 )>"Ky
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @FF{lK?[
Statement sm ; 0$=U\[og
sm = cn.createStatement(insert into user...); v:w^$]4
sm.executeUpdate(); NMC0y|G
sm.close(); V_ntS&2o
sm = cn.createStatement("insert into corp...); =@hCc
sm.executeUpdate(); PJ<qqA`!
sm.close(); }1CvbB%,A
3、提交 )1GJ^h$l
cn.commit(); !\Cu J5U
4、如果发生异常,那么回滚 =Uo*-EH
cn.rollback();