java 数据库基本操作 #=uV, dw
1、java数据库操作基本流程 >q&X#E<w
2、几个常用的重要技巧: dD351!-
可滚动、更新的记录集 b9R0"w!ml
批量更新 PRal>s&f
事务处理 j82x$I*
YQ|o0>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 R :*1Y\o(
1、取得数据库连接 g|Tkl
1)用DriverManager取数据库连接 */'j[uj
例子 `c)[aP{vN
String className,url,uid,pwd; 9y}/ G
className = "oracle.jdbc.driver.OracleDriver"; )k[{re
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Xl,707
uid = "system"; ]y9u5H^
pwd = "manager"; .k -!/ ^
Class.forName(className); )">uI\bi
Connection cn = DriverManager.getConnection(url,uid,pwd); oM^VtH=>
2)用jndi(java的命名和目录服务)方式 >PYc57S1c
例子 l@:&0id4I
String jndi = "jdbc/db"; j4wsDtmAU
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); "M3S
DataSource ds = (DataSource) ctx.lookup(jndi); s5\<D7
Connection cn = ds.getConnection(); sK@]|9ciQ
多用于jsp中 dvcLZK
2、执行sql语句 50e
vWD
1)用Statement来执行sql语句 3~%M4(
String sql; :sX4hZK=G
Statement sm = cn.createStatement(); 9
lXnNK
|]
sm.executeQuery(sql); // 执行数据查询语句(select) oD3]2o /
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9\Md.>
2)用PreparedStatement来执行sql语句 1\aV4T
String sql; BU<Qp$&
sql = "insert into user (id,name) values (?,?)"; $9@3dM*E?Z
PreparedStatement ps = cn.prepareStatement(sql); PDpuHHB
ps.setInt(1,xxx); GY rUB59
ps.setString(2,xxx); 4(? Z1S
... cTja<*W^xv
ResultSet rs = ps.executeQuery(); // 查询 l0r^LK$
int c = ps.executeUpdate(); // 更新 B{K_?ae!
r ?<?0j
3、处理执行结果 &})Zqc3Lqk
查询语句,返回记录集ResultSet LfvNO/:,
更新语句,返回数字,表示该更新影响的记录数 q*<FfO=eQ
ResultSet的方法 gI/SA
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =5O&4G`}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :z`L)
W0S\g#
4、释放连接 XnKf<|j6k
cn.close(); [:/mjO K
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection zmg
:Z p=
1()pKBHf
可滚动、更新的记录集 T"e"?JSRJ
1、创建可滚动、更新的Statement +^q-v-
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 'soll[J
该Statement取得的ResultSet就是可滚动的 C:_-F3|]cJ
2、创建PreparedStatement时指定参数 ZEB,Q~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); &8dj*!4H
ResultSet.absolute(9000); 62o nMY
批量更新 J u"/#@
1、Statement [U,hb1Wi3
Statement sm = cn.createStatement(); s(:N>K5*
sm.addBatch(sql1); (g>&ov(d
sm.addBatch(sql2); * $|9e
... jA3xDbM
sm.executeBatch() v2ab84
C*
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ,Vy_%f
2、PreparedStatement $\aJ.N6rb
PreparedStatement ps = cn.preparedStatement(sql); To;r#h
{ yPf,GB"
ps.setXXX(1,xxx); ~X-v@a
... |ADg#oX
ps.addBatch(); U9XOs)^
} _=K\E0I.m
ps.executeBatch();
uyoV)
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ;?{OX
cS>xT cj
事务的处理 C_ W%]8u
1、关闭Connection的自动提交 f9HoQDFsM
cn.setAutoCommit(false); fM3ZoH/
2、执行一系列sql语句 w x,gth*p
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g6H` uO
Statement sm ; brdY97s4
sm = cn.createStatement(insert into user...); )%q )!x
sm.executeUpdate(); {3BWT
sm.close(); 6n^vG/.M
sm = cn.createStatement("insert into corp...); ^@$T>SB1
sm.executeUpdate(); E8.1jCL>{"
sm.close(); o;v_vCLO
3、提交 -+Z&O?pSH
cn.commit(); loD:4e1
4、如果发生异常,那么回滚 SQ`KR'E
cn.rollback();