java 数据库基本操作 l> >BeZ
1、java数据库操作基本流程 1'5!")r
2、几个常用的重要技巧: ,7e 2M@=
可滚动、更新的记录集 4;w#mzd
批量更新 p-/}@r3Z+
事务处理 *1}vn%wvn
:wJ!rn,4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 cH7D@p}
1、取得数据库连接 ;"%luQA<w
1)用DriverManager取数据库连接 J1Y3>40
例子 NO#^_N`#\
String className,url,uid,pwd; ,0$b8lb;x/
className = "oracle.jdbc.driver.OracleDriver"; ||?wRMV
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; OL[_2m*;9p
uid = "system"; q{.~=~
pwd = "manager"; QpifO
Class.forName(className); 2K'}Vm+
Connection cn = DriverManager.getConnection(url,uid,pwd); ^[zF IO
2)用jndi(java的命名和目录服务)方式 l1RFn,Tzr
例子 {K2F(kz?T
String jndi = "jdbc/db"; ,@2d4eg4
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Vs[!WJ
7
DataSource ds = (DataSource) ctx.lookup(jndi); POQ1K
O
Connection cn = ds.getConnection(); JDC,]
多用于jsp中 5TdI
2、执行sql语句 W&^2Fb
1)用Statement来执行sql语句 M~!LjJg;
String sql; @yjui
Statement sm = cn.createStatement(); ;Y16I#?;Kh
sm.executeQuery(sql); // 执行数据查询语句(select) II_MY#0X
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Ia)^
2)用PreparedStatement来执行sql语句 *$>$O%
String sql; k?=V?JWY
sql = "insert into user (id,name) values (?,?)"; Iyvl6
PreparedStatement ps = cn.prepareStatement(sql); SHPZXJ{
ps.setInt(1,xxx); ?r~](l
ps.setString(2,xxx); ]9pcDZB
... 0 .p $q
ResultSet rs = ps.executeQuery(); // 查询 3!B3C(g
int c = ps.executeUpdate(); // 更新 HjN )~<j
6_a.`ehtj<
3、处理执行结果 5(OF~mX#
查询语句,返回记录集ResultSet ~
.Eln+N
更新语句,返回数字,表示该更新影响的记录数 ~9ILN~91
ResultSet的方法 v6?<)M%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,K[B/tD{j
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }~5xlg$B<<
K#{E87G(
4、释放连接 ]H<C Rw
cn.close(); 1')/ BM2
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection s/'gl
& ~[%N
O
可滚动、更新的记录集 Wkv**X}
1、创建可滚动、更新的Statement Afa{f}st
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); J XnPKAN
该Statement取得的ResultSet就是可滚动的 c5rQkDW
2、创建PreparedStatement时指定参数 IA;KEGJ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); mwTn}h3N
ResultSet.absolute(9000); >Y< y]vM:
批量更新 2jx+q
1、Statement ^q$vyY
Statement sm = cn.createStatement(); K+mtuB]yr
sm.addBatch(sql1); Qi7^z;
sm.addBatch(sql2); J0|}u1?l
... wGQ{
sm.executeBatch() Dl/_jM
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 XT_BiZ%l5O
2、PreparedStatement ?8C+wW
PreparedStatement ps = cn.preparedStatement(sql); M !OI :v
{ vR~*r6hX8
ps.setXXX(1,xxx); 49Ue2=PP#
... M+^K,
ps.addBatch(); #(*WxVE
} 6YU2
!x
ps.executeBatch(); C5RDP~au
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 uf)W?`e~
L ou4M
事务的处理 .^.UJo;4G
1、关闭Connection的自动提交 90aPIs-
cn.setAutoCommit(false); ^! ZjK-$A<
2、执行一系列sql语句 cCV"(Oo[H|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {Q(6
.0R
Statement sm ; P [nWmY
sm = cn.createStatement(insert into user...); gkk <-j'
sm.executeUpdate(); M7Hk54U+t
sm.close(); 5\Y/s o=
sm = cn.createStatement("insert into corp...); 0_D~n0rq,v
sm.executeUpdate(); ,n!xzoX_
sm.close(); #-HN[U?Gs
3、提交 =\%>O7c,8Y
cn.commit(); lE|T'?/
4、如果发生异常,那么回滚 c8"I]Qc7
cn.rollback();