java 数据库基本操作 iTsmUq<b]l
1、java数据库操作基本流程 la#f,C3_
2、几个常用的重要技巧: }M?\BH&
可滚动、更新的记录集 *Wk y#
批量更新 &No6k~T0:b
事务处理 ~$XbYR-
&.z: i5&o!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 MMCac6;Aea
1、取得数据库连接 L6`(YX.:
1)用DriverManager取数据库连接 Eyi^N0
例子 `s#0/t
String className,url,uid,pwd; {a`t1oX(
className = "oracle.jdbc.driver.OracleDriver"; Jj+|>(P
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3 EH/6
uid = "system"; H~%HTl
pwd = "manager"; &ywAzGV{s
Class.forName(className); Nq'Cuwsp
Connection cn = DriverManager.getConnection(url,uid,pwd); j<H`<S
2)用jndi(java的命名和目录服务)方式 lx*"Pj9hho
例子 ~_ss[\N
String jndi = "jdbc/db"; gTWl];xja
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); MMg"G6?
DataSource ds = (DataSource) ctx.lookup(jndi); G)5w_^&%
Connection cn = ds.getConnection(); ZN>oz@jY
多用于jsp中 GJz d4kj
2、执行sql语句 -q1vB8gjj
1)用Statement来执行sql语句 5W"&$6vj
String sql; ~]f+
Statement sm = cn.createStatement(); KdU!wsKfG
sm.executeQuery(sql); // 执行数据查询语句(select) j`jF{k b
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !4-B
xeNY\
2)用PreparedStatement来执行sql语句 3wZA,Z
String sql; z%cq%P8g
sql = "insert into user (id,name) values (?,?)"; O8:$sei$
PreparedStatement ps = cn.prepareStatement(sql); .;j} :<
ps.setInt(1,xxx); k(1]!c4J0
ps.setString(2,xxx); -w
nlJi1f
... <#AS[Q[N
ResultSet rs = ps.executeQuery(); // 查询 Q\>9PKK
int c = ps.executeUpdate(); // 更新 P0O5CaR
)X-b|D4O
3、处理执行结果 g4USKJ19.
查询语句,返回记录集ResultSet -o c@$*t
更新语句,返回数字,表示该更新影响的记录数 U-/-aNJ]U
ResultSet的方法 3vRRL
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |9>?{
B\a
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 _kUf[&
z5G<h
4、释放连接 <)n8lIK
cn.close(); #\9sCnb
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u1K;{>4lx
EIZSV>
可滚动、更新的记录集 2qV.`d
1、创建可滚动、更新的Statement 5dc24GB>_
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .OFwGOL%
该Statement取得的ResultSet就是可滚动的 ,{wA%Oy,
2、创建PreparedStatement时指定参数 dL;C4[(N
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %oVoE2T{@
ResultSet.absolute(9000); Wr+?ul*_
批量更新 4oW6&1
1、Statement Y1RiuJtL
Statement sm = cn.createStatement(); <=WSX{_D
sm.addBatch(sql1); 1F?`.~q
sm.addBatch(sql2); L=Cm0q 3v
... UHr0J jQK
sm.executeBatch() y4* }E
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 sevaNs
2、PreparedStatement p)l >bC?3
PreparedStatement ps = cn.preparedStatement(sql); L3[r7 b
{ [/_M!&zz2
ps.setXXX(1,xxx); H^y%Bi&^
... _SU%ul
ps.addBatch(); FPj j1U`C
} r [; .1,(
ps.executeBatch(); SF$'$6x}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 H}m%=?y@
YC!Tgb~H
事务的处理 qK}4r5U
1、关闭Connection的自动提交 l)y$c}U
cn.setAutoCommit(false); Brw-"tmx
2、执行一系列sql语句 lq0@)'D
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /G)Y~1ASA%
Statement sm ; %qG nvQ
sm = cn.createStatement(insert into user...); i,HafY
sm.executeUpdate(); 5!WQ
sm.close(); cQ kH4>C~
sm = cn.createStatement("insert into corp...); |+Gv)Rvp
sm.executeUpdate(); ?VC[%sjwn
sm.close(); ul0]\(sS:
3、提交 C1=7.dPr
cn.commit(); s;oDwT1
4、如果发生异常,那么回滚 !OwRx5
cn.rollback();