java 数据库基本操作 d A[MjOd3
1、java数据库操作基本流程 <=1nr@L
2、几个常用的重要技巧: >bgx o<
可滚动、更新的记录集 #Uc0W
批量更新 UbWeE,T~S
事务处理 bSK> p3
%Z:07|57I[
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 S,Y\ox-
1、取得数据库连接 `5J`<BPs
1)用DriverManager取数据库连接 6[\b]I\Q
例子 EbG`q!C
String className,url,uid,pwd; G@Jl4iHug"
className = "oracle.jdbc.driver.OracleDriver"; [I
XX#^F
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; K<BS%~,I
uid = "system"; vdhwFp~Y
pwd = "manager"; WF'Di4
Class.forName(className); 8-f2$
Connection cn = DriverManager.getConnection(url,uid,pwd); m+jW+
2)用jndi(java的命名和目录服务)方式 Cf~H9
例子 TGSUbBgU
String jndi = "jdbc/db"; #kmZS/"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); N;\G=q]
9
DataSource ds = (DataSource) ctx.lookup(jndi); 8y9`xRy
Connection cn = ds.getConnection(); Cob<N'.
多用于jsp中 #b^x! lR
2、执行sql语句 e!eUgD
1)用Statement来执行sql语句 ~~8?|@V
String sql; p3e_:5k
Statement sm = cn.createStatement(); n ]K`ofjl^
sm.executeQuery(sql); // 执行数据查询语句(select) \A~r~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 0$saDmED
2)用PreparedStatement来执行sql语句 fo$5WTY
String sql; 58v q5j<V
sql = "insert into user (id,name) values (?,?)"; 4u!<3-3Zy
PreparedStatement ps = cn.prepareStatement(sql); <@+>A$~0
ps.setInt(1,xxx); }3^b1D>2O
ps.setString(2,xxx); G1:*F8q
... {[
E7Cf
ResultSet rs = ps.executeQuery(); // 查询 ;usv/8
int c = ps.executeUpdate(); // 更新 LTof$4s
].A>ORS/
3、处理执行结果 != @U~X|cu
查询语句,返回记录集ResultSet -GqMis}c
更新语句,返回数字,表示该更新影响的记录数 D'nO
ResultSet的方法 [@"7qKd1
1、next(),将游标往后移动一行,如果成功返回true;否则返回false k+D32]b@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "s?!1v(v
NWNPq"
4、释放连接 G!%Cc0d"7
cn.close(); G$P|F6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection nVSuvq|S
xJ0Q8A
可滚动、更新的记录集 ;z>?-
j
1、创建可滚动、更新的Statement Z`W@Od$f
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); v/1&V+"^kd
该Statement取得的ResultSet就是可滚动的 ^GS,4[)H
2、创建PreparedStatement时指定参数 %-A #7\
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {}Q A#:V
ResultSet.absolute(9000); *[ @k=!73
批量更新 y*f5_
1、Statement Q?1'
JF!G
Statement sm = cn.createStatement(); S4'\=w#
sm.addBatch(sql1); |Z"5zL10
sm.addBatch(sql2); r@|{m QOxa
... r )pg9}+
sm.executeBatch() w^rINPAS
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 N:_U2[V^d
2、PreparedStatement MDyPwv\
PreparedStatement ps = cn.preparedStatement(sql); gG>|5R0
{ A,WZ}v}_
ps.setXXX(1,xxx); BLno/JK0}
... >3{l"SPU
ps.addBatch(); NHL -ll-R
} *.+Eg$'~V
ps.executeBatch(); dx<KZR$!V
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ME9jN{ le
[6$n
事务的处理 t9Sog~:'
1、关闭Connection的自动提交
Z>O2
cn.setAutoCommit(false); xn=/SIS
2、执行一系列sql语句 O<H5W|cM
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close <<ze84E
Statement sm ; K~U5jpc
sm = cn.createStatement(insert into user...); I_h8)W
sm.executeUpdate(); cTq}H_hC
sm.close(); C}7c:4c
sm = cn.createStatement("insert into corp...); !8z,}HUdK
sm.executeUpdate(); z. 6-D
sm.close(); A.D@21py
3、提交 gGtl*9a=
cn.commit(); ]V `L\
4、如果发生异常,那么回滚 2$Fy?08q
cn.rollback();