java 数据库基本操作 f'M([gn^_
1、java数据库操作基本流程 2,|;qFJY-@
2、几个常用的重要技巧: EiZa,}A
可滚动、更新的记录集 "-rqL
批量更新 H_aG\
事务处理 .2ZFJ.Z"
H9!q)qlK
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 OpK_?XG
1、取得数据库连接 (zk/>Ou
1)用DriverManager取数据库连接 ovi^bNQ
例子 |goK@<
String className,url,uid,pwd; % w
className = "oracle.jdbc.driver.OracleDriver"; Fw}|c
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <zAYq=IU
uid = "system"; ip1gCH/?_+
pwd = "manager"; N8J(RR9O
Class.forName(className); S a}P
|qI
Connection cn = DriverManager.getConnection(url,uid,pwd); cz|?j
2)用jndi(java的命名和目录服务)方式 @*|T(068&
例子 3od16{YH
String jndi = "jdbc/db"; NBLjBa%eL
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -YrMVoZl
DataSource ds = (DataSource) ctx.lookup(jndi); !E)|[:$XT
Connection cn = ds.getConnection(); f=S2O_Ee
多用于jsp中 Imq-5To#
2、执行sql语句 T{yJL<
1)用Statement来执行sql语句 VC%.u.< F
String sql; $3%+N|L
Statement sm = cn.createStatement(); o-;/x)
sm.executeQuery(sql); // 执行数据查询语句(select) +F2X2e)g"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); |y+_BZ5
2)用PreparedStatement来执行sql语句 x]3[0K5;
String sql; ]IzD`
sql = "insert into user (id,name) values (?,?)"; K%Bz6 ~
PreparedStatement ps = cn.prepareStatement(sql); V\l@_%D[(v
ps.setInt(1,xxx); "7jE&I
ps.setString(2,xxx); 4GXS(
... <z>oY2%
ResultSet rs = ps.executeQuery(); // 查询 $q.}eb0
int c = ps.executeUpdate(); // 更新 QBN\wL8g
v53|)]V
3、处理执行结果 ~03MH'
查询语句,返回记录集ResultSet F!*GrQms
更新语句,返回数字,表示该更新影响的记录数 w8 `1'*HG
ResultSet的方法 k_Y7<z0G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false es=OWJt^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Ki&a"Fu3
YBF$/W+=9|
4、释放连接 <$otBC/%
cn.close(); Htln <N
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &
Y2xO
Bvh{|tP4
可滚动、更新的记录集 SQ/HZ
1、创建可滚动、更新的Statement ,xAF=t
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #VVfHCy
该Statement取得的ResultSet就是可滚动的 \<G"9w
2、创建PreparedStatement时指定参数 |{_>H'
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $J&c1
ResultSet.absolute(9000); y*v|q=
批量更新 >7S@3,C3ke
1、Statement ]0j_yX
Statement sm = cn.createStatement(); !]RSG^%s{
sm.addBatch(sql1); ~P;A
9A(k
sm.addBatch(sql2); xtLP4VL
... x;Slv(|M
sm.executeBatch() <^_crJONom
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0r8Wv,7Bo
2、PreparedStatement ik;F@kdm`
PreparedStatement ps = cn.preparedStatement(sql); Chx+p&!
{ -|>T?
t'K
ps.setXXX(1,xxx); %H,s~IU
... \j3dB
tc
ps.addBatch(); ?,8+1"|$A]
} XrWWV2[
ps.executeBatch(); rPqM&&+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 a(D=ZKbVU
$$"G1<EZ
事务的处理 ~1 31|e`C
1、关闭Connection的自动提交 p8?v
o?^
cn.setAutoCommit(false); >}W[>WReI
2、执行一系列sql语句 ]^>:)q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =
Statement sm ; J_-fs#[x
sm = cn.createStatement(insert into user...); E-FR
w
sm.executeUpdate(); B&0W P5OF
sm.close(); %~gI+0HK
sm = cn.createStatement("insert into corp...); <V Rb
sm.executeUpdate(); .>P:{''
sm.close(); QG2 Zh9R
3、提交 D|Wlq~IpQ
cn.commit(); D}j`T
4、如果发生异常,那么回滚 kxJ[Bi#
cn.rollback();