java 数据库基本操作 1Uk Gjw1J
1、java数据库操作基本流程 1h#e-Oyff
2、几个常用的重要技巧: l$ufW|
可滚动、更新的记录集 Qm>2,={h
批量更新 ,*CPG$L
事务处理 <5o
oML]nP
'g:.&4x_w
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 0bl 8J5Ar5
1、取得数据库连接 D.*o^{w|
1)用DriverManager取数据库连接 GS+Z(,J>=
例子 74fE%;F
String className,url,uid,pwd; QE+HL8c^s
className = "oracle.jdbc.driver.OracleDriver"; L~{3W
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; W]I+Rlv)U
uid = "system"; Wgb L9'}B
pwd = "manager"; @G^m+-
Class.forName(className); Hv-f :P O
Connection cn = DriverManager.getConnection(url,uid,pwd); Dbw{E:pq
2)用jndi(java的命名和目录服务)方式 D\^\_r):
例子 `rb}"V+
String jndi = "jdbc/db"; fVz0H1\J&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8c%_R23
DataSource ds = (DataSource) ctx.lookup(jndi); ~_a$5Y
Connection cn = ds.getConnection(); &vN^*:Q
多用于jsp中 #:s*Hy=
2、执行sql语句 dU&hM<.|
1)用Statement来执行sql语句 98XlcI#
String sql; IsiBn(1Z
Statement sm = cn.createStatement(); kK/([!
sm.executeQuery(sql); // 执行数据查询语句(select) dO4Jf9)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); p(.z#o#
2)用PreparedStatement来执行sql语句 I R~szUY6
String sql; QC6:ZxP
sql = "insert into user (id,name) values (?,?)"; L\xR<m<,
PreparedStatement ps = cn.prepareStatement(sql); <+_WMSf;4
ps.setInt(1,xxx); SAhk `_
ps.setString(2,xxx); *K;s*-|U
... Igh=Z %
ResultSet rs = ps.executeQuery(); // 查询 Y3O/`-9i
int c = ps.executeUpdate(); // 更新 rw.DKM'
rIeOli:<
3、处理执行结果 LC})aV|
查询语句,返回记录集ResultSet |p`}vRv
Uh
更新语句,返回数字,表示该更新影响的记录数 [Gc9
3PA7q
ResultSet的方法 z[WdJN{
1、next(),将游标往后移动一行,如果成功返回true;否则返回false /kAbGjp0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6[Wv g
DLO2$d
4、释放连接 Ie(M9QMp
cn.close(); cC]lO
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q!{,^Qb
?*&5`Xh
可滚动、更新的记录集 a+<{!+3v
1、创建可滚动、更新的Statement sp6A*mwl
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); EbnV"]1
该Statement取得的ResultSet就是可滚动的 <=]:ED $V@
2、创建PreparedStatement时指定参数 )yUSuK(Vu
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 95sK ;`rE+
ResultSet.absolute(9000); 3|BB#;
批量更新 +NTC!/
1、Statement M8${&&[;
Statement sm = cn.createStatement(); t8.^Y TI
sm.addBatch(sql1); MH/bJtNq
sm.addBatch(sql2); ~uu{
v')
... ^/)%s 3
sm.executeBatch() L:7 kp<E
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 TGGbO:s3
2、PreparedStatement 4o<'
fY
PreparedStatement ps = cn.preparedStatement(sql); 2%vG7o,#
{ APyH.] mQ
ps.setXXX(1,xxx); EN5F*s@r
... g\pLQH
ps.addBatch(); \m#{{SGm
} 28>/#I9/]
ps.executeBatch(); IQQ>0^Q~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ]v#T9QQN
*iJ>@vew
事务的处理 Z@0IvI
1、关闭Connection的自动提交 ZhFlR*EQ
cn.setAutoCommit(false); X'p%K/-m
2、执行一系列sql语句 Qn}M
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close UZ!It>
Statement sm ; 03gYl0B
sm = cn.createStatement(insert into user...); FiKGB\_]
sm.executeUpdate(); |Q$Dj!!1P
sm.close(); U% OlYP$g
sm = cn.createStatement("insert into corp...); Q-KBQc
sm.executeUpdate(); fvRqt)Ks
sm.close(); H^+Znmo
3、提交 e17]{6y
cn.commit(); x#fv<Cj4
4、如果发生异常,那么回滚 ''}2JJU{
cn.rollback();