java 数据库基本操作 ^;Hi/KvM\
1、java数据库操作基本流程 @??c<]9F
2、几个常用的重要技巧: xu_XX#9?b
可滚动、更新的记录集 U'h[{ek
批量更新 )L(d$N=Bd
事务处理 vs'L1$L'c
SSL%$:l@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 b68G&z>
1、取得数据库连接 Vav+$l|j@
1)用DriverManager取数据库连接 #T$'.M
例子 %_j?<h&
String className,url,uid,pwd; -NflaV~
className = "oracle.jdbc.driver.OracleDriver"; >DL-Q\U
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; R>e3@DQ~
uid = "system"; >arO$|W
pwd = "manager"; .Kh(F6
s
Class.forName(className); ok\/5oz
Connection cn = DriverManager.getConnection(url,uid,pwd); ?;.1fJU>
2)用jndi(java的命名和目录服务)方式 sjkKaid
例子 02# b:
String jndi = "jdbc/db"; FB=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 3"^)bGe
DataSource ds = (DataSource) ctx.lookup(jndi); `!Ge"JB6
Connection cn = ds.getConnection(); qy42Y/8'
多用于jsp中 eJ=Y6;d$
2、执行sql语句 Mc$v~|i6
1)用Statement来执行sql语句 PG v}fEH"
String sql; :)J~FVLy
Statement sm = cn.createStatement(); }^GV(]K
sm.executeQuery(sql); // 执行数据查询语句(select) BJO~$/R?v
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); \HP,LH[P:
2)用PreparedStatement来执行sql语句 xXY)KI
N[
String sql; 8@LykJbP
sql = "insert into user (id,name) values (?,?)"; =:n[{/O=
PreparedStatement ps = cn.prepareStatement(sql); qK6
uU9z
ps.setInt(1,xxx); 32-3C6f@oZ
ps.setString(2,xxx); bKt3x+x(
... vVAZSR#
ResultSet rs = ps.executeQuery(); // 查询 xeP;"J}
int c = ps.executeUpdate(); // 更新 u>Axq3F
QkCoW[sn
3、处理执行结果 *p#YK|
查询语句,返回记录集ResultSet XvzV
lKL
更新语句,返回数字,表示该更新影响的记录数 ?/l}(t$H
ResultSet的方法 Xv5Ev@T
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Y(I*%=:$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |H+k?C-w
3]kAb`9[K2
4、释放连接 0JZq:hUd
cn.close(); W-]yKSob
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection qLW-3W;WUH
TNyY60E
可滚动、更新的记录集 cV,03]x
1、创建可滚动、更新的Statement YZ%f7BUk
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); fssL'DD
该Statement取得的ResultSet就是可滚动的 4KSP81}/\
2、创建PreparedStatement时指定参数 I|3v&E1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); T\e)Czz2-
ResultSet.absolute(9000); WfjUJw5x"s
批量更新 _ KkVI7a
1、Statement x4m_(CtK
Statement sm = cn.createStatement(); :J4C'N
sm.addBatch(sql1); )r|zi
Z {F
sm.addBatch(sql2); #:\+7mCF
... /w xxcq
sm.executeBatch() .IAHy)li"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 LWb}) #E
2、PreparedStatement CQuvbAo
PreparedStatement ps = cn.preparedStatement(sql); RoM*Qjw
{ wmcp`8w.
ps.setXXX(1,xxx); TaHi+
... ,tR'0&=
ps.addBatch(); 7jg(j~tQ
} qf&a<[p~
ps.executeBatch(); \q`+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?xTeio44
IO)Ft
事务的处理 k2tX$ \E
1、关闭Connection的自动提交 (zLIv9$
cn.setAutoCommit(false); q!oZ; $
2、执行一系列sql语句 4#7@KhK}
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g`8
mh&u%
Statement sm ; dBq,O%$oq
sm = cn.createStatement(insert into user...); 2|NyAtPb5
sm.executeUpdate(); QsF<=b~
sm.close(); c{4nW|/W
sm = cn.createStatement("insert into corp...); F=T.*-oS3
sm.executeUpdate(); eg~^wi
sm.close(); q}A3"$-F
3、提交 BK\~I
cn.commit(); "$"mWF-
4、如果发生异常,那么回滚 <$3nD b-
cn.rollback();