java 数据库基本操作 ~wW]ntZm
1、java数据库操作基本流程 (]'wQ4iQ
2、几个常用的重要技巧: tB>!1}v
可滚动、更新的记录集 z]8Mv(eL
批量更新 s|<n7 =J
事务处理 Q;3`T7
)m7%cyfC
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 x!GDS>
1、取得数据库连接 g3kbsi7_:
1)用DriverManager取数据库连接 /(s |'"6
例子 Q"FN"uQ}x
String className,url,uid,pwd; ivo><"Y(r
className = "oracle.jdbc.driver.OracleDriver"; M8WjqTq
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; S,:!H@~B
uid = "system"; 1w7tRw
pwd = "manager"; G^d3$7
Class.forName(className); /P,1KVQPh
Connection cn = DriverManager.getConnection(url,uid,pwd); 7/<~s]D[%
2)用jndi(java的命名和目录服务)方式 cOP'ql{"
例子 e#HPU
String jndi = "jdbc/db"; =A6*;T"W
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); A_@..hX(
DataSource ds = (DataSource) ctx.lookup(jndi); ?Sh]kJO
Connection cn = ds.getConnection(); /W,hOv
多用于jsp中 0 j!<eN=
2、执行sql语句 _WWC8?6U
1)用Statement来执行sql语句 3:jxr
String sql; r[Pp[g-J
Statement sm = cn.createStatement(); 3\m!
sm.executeQuery(sql); // 执行数据查询语句(select) O.Pp*sQ^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ++,I`x+p
2)用PreparedStatement来执行sql语句 85&7WAco"B
String sql; ;?HP/dZLz
sql = "insert into user (id,name) values (?,?)"; _?"y1L.
PreparedStatement ps = cn.prepareStatement(sql); y60aJ)rAX
ps.setInt(1,xxx); p)B/(%
ps.setString(2,xxx); J(#6Cld`c
... G;cC!x<
ResultSet rs = ps.executeQuery(); // 查询 O"~[njwkE
int c = ps.executeUpdate(); // 更新 MS""-zn<
%^lD
3、处理执行结果 Gf.ywqE$Y$
查询语句,返回记录集ResultSet L3I$ K+c
更新语句,返回数字,表示该更新影响的记录数 F*U(Wl=
ResultSet的方法 }b54O\,
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~|=D.}#$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Q9OCf"n $
B`eK_'7t
4、释放连接 cL#-vW<s3
cn.close(); *RS/`a;,
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Fya*[)HBo
}'wZ)N@
可滚动、更新的记录集 $Be hU
1、创建可滚动、更新的Statement c9 EtUv~
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); -b!Z(}JK
该Statement取得的ResultSet就是可滚动的 ^)]U5+g?
2、创建PreparedStatement时指定参数 F,S)P`?
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); yrEh5v:
ResultSet.absolute(9000); }@6Ze$>
批量更新 `G!HGzVx;j
1、Statement 4$VDJ
Statement sm = cn.createStatement(); o
A2oX
sm.addBatch(sql1); )e0kr46
sm.addBatch(sql2); BmpAH}%T
... "v?F4&\ 8
sm.executeBatch() 0^>,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P,pC Z+H
2、PreparedStatement #:BkDidt2v
PreparedStatement ps = cn.preparedStatement(sql); (Nc~l ^a
{ Vc5>I_
ps.setXXX(1,xxx); ^*f D
... +:^l|6%}
ps.addBatch(); 'v<v6vs
} J(}PvkA
ps.executeBatch(); \VhG'd3k
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !aUYidd
8:c=h/fa
事务的处理 vzs4tkG
1、关闭Connection的自动提交 >#:SJ?)`T
cn.setAutoCommit(false); FW8Zpr!u
2、执行一系列sql语句 (]cL5o9
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (
y!o
Statement sm ; TsT5BC63
sm = cn.createStatement(insert into user...); k F^4kCJ@
sm.executeUpdate(); pqO0M]}
sm.close(); qZF&^pCF}
sm = cn.createStatement("insert into corp...); b%MZfaU
sm.executeUpdate(); /v9qrZ$$
sm.close(); R/"f
3、提交 RgV3, z
cn.commit(); ?`e@ o?
4、如果发生异常,那么回滚 GFLat
cn.rollback();