java 数据库基本操作 T!F0_<
1、java数据库操作基本流程 d8p<f+
2、几个常用的重要技巧: 6`JY:~V"
可滚动、更新的记录集 Ob~7r*q
批量更新 bZKlQ<sI
事务处理 6]D%|R,Q#}
h@H8oZ[
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 IHs^t/;Iv
1、取得数据库连接 F^/b!)4X
1)用DriverManager取数据库连接 f7y3BWOi]
例子 L#>^R
String className,url,uid,pwd; 4]P5k6nV
className = "oracle.jdbc.driver.OracleDriver"; ToXgl4:kd
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !VoAN5#;
uid = "system"; R2`-*PZ_
pwd = "manager"; (]}52%~
Class.forName(className); v|K'M,E
Connection cn = DriverManager.getConnection(url,uid,pwd); ?\.DG`Zxc
2)用jndi(java的命名和目录服务)方式 /9 ^F_2'_
例子 K
K_
String jndi = "jdbc/db"; %0MvCm
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); G oHdhne3
DataSource ds = (DataSource) ctx.lookup(jndi); +;|" #
Connection cn = ds.getConnection(); |vUjoa'.7E
多用于jsp中 v&]k8Hc-
2、执行sql语句 ~5@bWJ
1)用Statement来执行sql语句 wa f)S=
String sql; _Xe"+
Statement sm = cn.createStatement(); mFa%d8Y
sm.executeQuery(sql); // 执行数据查询语句(select) \kS:u}Ip!
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); oz[Mt
i*
2)用PreparedStatement来执行sql语句 H-g
CY|W
String sql; |3SM
sql = "insert into user (id,name) values (?,?)"; qH9bo-6
PreparedStatement ps = cn.prepareStatement(sql); M. o}?
ps.setInt(1,xxx); # ^q87y
ps.setString(2,xxx); ,g~Iup
... Kwmtt
ResultSet rs = ps.executeQuery(); // 查询 F39H@%R
int c = ps.executeUpdate(); // 更新 R<eD)+
IJQ"
*;
3、处理执行结果 O+w82!<:
查询语句,返回记录集ResultSet 5 >c,#*
更新语句,返回数字,表示该更新影响的记录数 W3M1> (
ResultSet的方法
5B)z}g^h
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 3X>x`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ->S# `"@$
w40 -K5wt>
4、释放连接 )xxpO$
cn.close(); ; VH:dg
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection B ?%g@d-;
O}Mu_edM
可滚动、更新的记录集 5z=.Z\M`8
1、创建可滚动、更新的Statement :+?w>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); NQu.%=
该Statement取得的ResultSet就是可滚动的 (aUdPo8H^
2、创建PreparedStatement时指定参数 d [f,Nu'
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); aJ3.D
ResultSet.absolute(9000); }c?W|#y`.o
批量更新 _rakTo8BY
1、Statement C>=[fAr mO
Statement sm = cn.createStatement(); ;Im%L=q9GL
sm.addBatch(sql1); E},^,65
sm.addBatch(sql2); h( V:-D
... 3I.0jA#T&/
sm.executeBatch() <oKoz0!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8ZN"-]*
2、PreparedStatement oQL$X3S
PreparedStatement ps = cn.preparedStatement(sql); s.IYPH|pn
{ G4jyi&]
ps.setXXX(1,xxx); (
C~ u.
... =#so[Pd
ps.addBatch(); SsBiCctn
} G5!J9@Yi
ps.executeBatch(); j#rj_ uP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m3']/}xHO
b
sM]5^
事务的处理 &peUC n
1、关闭Connection的自动提交 !3;KC"o
cn.setAutoCommit(false); jM5w<T-2/
2、执行一系列sql语句
<
pWk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +zL|j/q ?
Statement sm ; duq(K9S
sm = cn.createStatement(insert into user...); O-,0c1ts
sm.executeUpdate(); {Lg]chJq?
sm.close(); ;%a
sm = cn.createStatement("insert into corp...); 8:gUo8
sm.executeUpdate(); =pnMV"'9
sm.close(); kdW$>Jqb
3、提交 B }t529Z
cn.commit(); -
U Elu4n&
4、如果发生异常,那么回滚 e jh0Wfl
cn.rollback();