java 数据库基本操作 %IXW|mi
1、java数据库操作基本流程 /Gv$1t^a
2、几个常用的重要技巧: Y/I6.K3
可滚动、更新的记录集 h}<ZZ
批量更新 5Cyjq0+
事务处理 z7pXpy \
Z!l!3(<G.f
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 bvRGTOxO
1、取得数据库连接 >"{zrwNq
1)用DriverManager取数据库连接 YqCK#zT/
例子 w=>mG-
String className,url,uid,pwd; +rO<'H:umJ
className = "oracle.jdbc.driver.OracleDriver"; 4'[ V'c\
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; uiEA=*axp
uid = "system"; cZT.vA#
pwd = "manager"; l5nDt$Ex
Class.forName(className); 05LQh
Connection cn = DriverManager.getConnection(url,uid,pwd); )P+GklI{4
2)用jndi(java的命名和目录服务)方式 3NZFW{u
例子 1b%7FrPkd
String jndi = "jdbc/db"; R'HA>?D
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); =9@yJ9c-
DataSource ds = (DataSource) ctx.lookup(jndi); '*Mb
.s"
Connection cn = ds.getConnection(); mnaD KeA
多用于jsp中 O}!@28|3"
2、执行sql语句 O9&:(2'f
1)用Statement来执行sql语句 % x;!s=U
String sql; G")EE#W$}
Statement sm = cn.createStatement(); 5&Kn #
sm.executeQuery(sql); // 执行数据查询语句(select) ho$%7mc
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); GQBN-Qv
2)用PreparedStatement来执行sql语句 V/%;:ul.
String sql; ryLNMh
sql = "insert into user (id,name) values (?,?)"; g'7hc~=
PreparedStatement ps = cn.prepareStatement(sql); u(`A?H:
ps.setInt(1,xxx); O!Cu.9}
ps.setString(2,xxx); (,y/nc=GN
... |CqJ2
ResultSet rs = ps.executeQuery(); // 查询 eH*b-H[
int c = ps.executeUpdate(); // 更新 `bF;Ew;
=_6h{f&Q
3、处理执行结果 ?O
Nw*"9
查询语句,返回记录集ResultSet rM.<Gi05Qe
更新语句,返回数字,表示该更新影响的记录数 cHct|Z
u
ResultSet的方法 )Dpt<}}\
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 3(p6ak2lv
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Q8:ocEhR
C>VZf,JE1
4、释放连接 x}j41E}
cn.close(); ^i1:PlW]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Y &+/[[
*lO+^\HXD
可滚动、更新的记录集 Mwk_SCy
1、创建可滚动、更新的Statement +Z]%@"S?
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); DQnWLC"u
该Statement取得的ResultSet就是可滚动的 _oVA0@#n
2、创建PreparedStatement时指定参数 ?{")Wt
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5)<jPyC
ResultSet.absolute(9000); (.+n1)L?
批量更新 YcZ4y@6"
1、Statement uNBhVsM6<
Statement sm = cn.createStatement(); |:[vpJFK
sm.addBatch(sql1); P?7b,a95O
sm.addBatch(sql2); X6 cb#s0|
... H;&t"Ql.
sm.executeBatch() P9wDTZ
:4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 nQmYeM
2、PreparedStatement 83*k.]S`
PreparedStatement ps = cn.preparedStatement(sql); 5~0;R`D
{ LdUpVO8)l
ps.setXXX(1,xxx); 1zW6Pb
... 3s`3}DKK
ps.addBatch(); /=} vPey
} VNXVuM )c
ps.executeBatch(); nP31jm+A
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 j-|0&X1C
zSCPp6
事务的处理 XS/TYdXB8
1、关闭Connection的自动提交 s$6#3%h
cn.setAutoCommit(false); ZW%`G@d"H-
2、执行一系列sql语句 "ukbqdKD
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close D*,H%xA
Statement sm ; J< M;vB)
sm = cn.createStatement(insert into user...); tn1aH
+
sm.executeUpdate(); WQL`;uIX
sm.close(); h]P$L>
sm = cn.createStatement("insert into corp...); "FS.&&1(
sm.executeUpdate(); L9)&9
/f
sm.close(); |pY0IqO
3、提交 a| cD{d
cn.commit(); rd{(E
4、如果发生异常,那么回滚 SbivW5|61
cn.rollback();