java 数据库基本操作 rGe^$!QB
1、java数据库操作基本流程 >5jHgs#
2、几个常用的重要技巧: [}OL@num
可滚动、更新的记录集 *ppb4R;CW
批量更新 j;k(AM<
事务处理 92k}ON
-~HlME*~f
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [[[QBplJ
1、取得数据库连接 c[Mz#BWG
1)用DriverManager取数据库连接 (Rc0 l;
例子 M\s^>7es
String className,url,uid,pwd; -0)So
className = "oracle.jdbc.driver.OracleDriver"; r]=3aebR.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !\NKu1ta
uid = "system"; M]>JI'8
pwd = "manager"; N
-]m <z>
Class.forName(className); y{eZrX|
Connection cn = DriverManager.getConnection(url,uid,pwd); e<p_u)m
2)用jndi(java的命名和目录服务)方式 S %"7`xl
例子 )pVxp]EI
String jndi = "jdbc/db"; iK"j@1|
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); `f^`i~c\
DataSource ds = (DataSource) ctx.lookup(jndi); Ccocv>=Q&J
Connection cn = ds.getConnection(); a91Q*X%
多用于jsp中 /rNY;qXM
2、执行sql语句 !HXdUAKu
1)用Statement来执行sql语句 +M\*C#
String sql; ] 05Q4
Statement sm = cn.createStatement(); 1?(mE7H#
sm.executeQuery(sql); // 执行数据查询语句(select) tc{23Rf%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); b'N"?W^YQ
2)用PreparedStatement来执行sql语句 aNW&ib
String sql; P-~Avb
sql = "insert into user (id,name) values (?,?)"; *TuoC5
PreparedStatement ps = cn.prepareStatement(sql); azB~>#H~
ps.setInt(1,xxx); n^/,>7J
ps.setString(2,xxx); qvOBvUR}
... ``kKi3TWJ
ResultSet rs = ps.executeQuery(); // 查询 r)mm8MI!Z
int c = ps.executeUpdate(); // 更新 )N-+,Ms
q\[31$i$
3、处理执行结果 w9}I*Nra
查询语句,返回记录集ResultSet l1odkNf|
更新语句,返回数字,表示该更新影响的记录数 rr4yJ;qpeP
ResultSet的方法 p Nu13o~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %a/O7s 6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值
e?G*q)l
1ezQzc2-R
4、释放连接 T^GdN_qF
cn.close(); 4(JxZ49
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .)Se-'
r _r$nl
可滚动、更新的记录集 n X
Qz
1、创建可滚动、更新的Statement UhCd,
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); E"Xi
该Statement取得的ResultSet就是可滚动的 xiRTp:>
2、创建PreparedStatement时指定参数 6x@-<{L
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 1&YP}sg)
ResultSet.absolute(9000); cf@#a@7m9
批量更新 qRB7I:m-Wi
1、Statement vfhip"1
Statement sm = cn.createStatement(); Qb# S)[6s+
sm.addBatch(sql1); VH*j3
sm.addBatch(sql2); @F7QQs3
... c2"eq2'BS
sm.executeBatch() kXX RMR
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 v%aD:%wlY@
2、PreparedStatement 5<w0*~Zd~
PreparedStatement ps = cn.preparedStatement(sql); 33Mr9Doon
{ 4
qW)R{%
ps.setXXX(1,xxx); n?,fF(
... bM^'q
ps.addBatch(); 72-@!Z0e
} g6W.Gl"5\w
ps.executeBatch(); y+:<
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 cDTDim1F
GW
$iK@
事务的处理 <{-DYRiN
1、关闭Connection的自动提交 6!Isz1.re
cn.setAutoCommit(false); N7#GK]n%/}
2、执行一系列sql语句 gdC=SFb b
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close )QZ?Bf
Statement sm ; 6ldDt?iSg
sm = cn.createStatement(insert into user...); fQx 4/4j
sm.executeUpdate(); R4qk/@]t
sm.close(); DTIy/
sm = cn.createStatement("insert into corp...); m dC. FO-
sm.executeUpdate(); t%dPj8~
sm.close(); G#%
=R`k/
3、提交 56':U29.]
cn.commit(); Nq~bO_-I
4、如果发生异常,那么回滚 kD;BwU[
cn.rollback();