java 数据库基本操作 c+ByEP4EG
1、java数据库操作基本流程 Y]](.\ff
2、几个常用的重要技巧: }a.j~>rq
可滚动、更新的记录集 $/B~ bJC
批量更新 l;L_A@B<
事务处理 Pg{1' -
.T3 m%n
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 XM,slQ
1、取得数据库连接 qb/}&J7+
1)用DriverManager取数据库连接 o. ;Vrc
例子 ^_<|~
String className,url,uid,pwd; o:fe`#t
className = "oracle.jdbc.driver.OracleDriver"; RAP-vVh/C
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; CxZh^V8LP
uid = "system"; l`i97P?/W
pwd = "manager"; \C h01LR"
Class.forName(className); 2E[7RBFY+\
Connection cn = DriverManager.getConnection(url,uid,pwd); I[d<SHo
2)用jndi(java的命名和目录服务)方式 ]JV'z<
例子 ]bY]YNt{7]
String jndi = "jdbc/db"; (QJe-)0_y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); rp{|{>'`.q
DataSource ds = (DataSource) ctx.lookup(jndi); x3Y)l1gh
Connection cn = ds.getConnection(); b*M?\ aA
多用于jsp中 n P]!{J]
2、执行sql语句 _lFw1pa#\
1)用Statement来执行sql语句 l
$"hhI8
String sql; $2?j2}M
Statement sm = cn.createStatement(); fe,6YXUf
sm.executeQuery(sql); // 执行数据查询语句(select) =I)43ahd
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~~ rR< re
2)用PreparedStatement来执行sql语句 !hhL",
String sql; ~rJG4U
sql = "insert into user (id,name) values (?,?)"; |E.BGdS
PreparedStatement ps = cn.prepareStatement(sql); [nP s
ps.setInt(1,xxx); /:'>-253
ps.setString(2,xxx); n2hV}t9O
... >( [,yMIY
ResultSet rs = ps.executeQuery(); // 查询 3m`>D
e
int c = ps.executeUpdate(); // 更新 ~IS8DW$;
9;?u%
3、处理执行结果 ~"CGur P
查询语句,返回记录集ResultSet }Mt1C~{(
更新语句,返回数字,表示该更新影响的记录数 7K:V<vX5
ResultSet的方法 HP1QI/*v
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (rkg0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 X3X_=qzc
]p3f54!
4、释放连接 +ovK~K$A
cn.close(); wz*iwd-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (Y@T5-!D
$?G@ijk,
可滚动、更新的记录集 |f#hGk6
1、创建可滚动、更新的Statement pX?3inQP%(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); v/.'st2%
该Statement取得的ResultSet就是可滚动的 n]ba1t8ZA
2、创建PreparedStatement时指定参数 x9 %=d
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); '2H?c<Y3
ResultSet.absolute(9000); \`2'W1O
批量更新 t'l4$}(
1、Statement MmR6V#@:
Statement sm = cn.createStatement(); ]f0'YLG
sm.addBatch(sql1); .Dr!\.hL
sm.addBatch(sql2); c{BAQZVc
... wG3b{0
sm.executeBatch() =abcLrf2G
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 jk03 Hd
2、PreparedStatement bj`\;_oo
PreparedStatement ps = cn.preparedStatement(sql); 2!Dz9m3
{ E,}{ iqAb
ps.setXXX(1,xxx); 7|DG1p9C
... v{VF>qEP
ps.addBatch(); og5VB
} {E:`
ps.executeBatch(); gM\>{ihM'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 pOc2V
SG&,o=I$
事务的处理 ir_XU/ve
1、关闭Connection的自动提交 a(~Y:v
cn.setAutoCommit(false); q[,p#uJ]
2、执行一系列sql语句 yu6{ 6[
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6*q1%rs:w
Statement sm ; ^{4BcM7eH
sm = cn.createStatement(insert into user...); ~v.mbh
sm.executeUpdate(); jtP*C_Scv/
sm.close(); :ZV|8xI
sm = cn.createStatement("insert into corp...); ERpAV-Zf
sm.executeUpdate(); >u&D@7~c
sm.close(); &*=!B9OBI
3、提交 U]=yCEb8p
cn.commit(); z'EQdQ)
4、如果发生异常,那么回滚 %N*[{j= ^
cn.rollback();