java 数据库基本操作 Hi[lN7ma8
1、java数据库操作基本流程 oi0O4J%H
2、几个常用的重要技巧: IMD^(k 2
可滚动、更新的记录集 hFA |(l6
批量更新 {Ycgq%1>]
事务处理 9mDdX
-I5]#%eX^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 $R#_c}
1、取得数据库连接 MlWKfe<
1)用DriverManager取数据库连接 Jzf+"%lv
例子 {O _X/y~
String className,url,uid,pwd; aZ~e;}w.Zq
className = "oracle.jdbc.driver.OracleDriver"; X]}ai5
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; I '0[
uid = "system"; *x8~}/[T(F
pwd = "manager"; TYuP
EVEXZ
Class.forName(className); ph6/+[:
Connection cn = DriverManager.getConnection(url,uid,pwd); oX)a6FXK>
2)用jndi(java的命名和目录服务)方式 <.Tllk@r)
例子 O;VqrO
String jndi = "jdbc/db"; h's[)
t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); xCL)<8[R,}
DataSource ds = (DataSource) ctx.lookup(jndi); b$Hbo;_
Connection cn = ds.getConnection(); 65 zwi-
多用于jsp中 qE2<vjRg
2、执行sql语句 |h $Gs2
1)用Statement来执行sql语句 *=@8t^fa86
String sql; ',hoe
Statement sm = cn.createStatement(); ?3N/#
sm.executeQuery(sql); // 执行数据查询语句(select) wrJQkven-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Q3ZGN1aX<
2)用PreparedStatement来执行sql语句 :gRrM)n
String sql; [UkcG9
sql = "insert into user (id,name) values (?,?)"; nycJZ}f:wP
PreparedStatement ps = cn.prepareStatement(sql); \_.'/<aQ
ps.setInt(1,xxx); mL1ZSX
o!
ps.setString(2,xxx); 1R-0b{w[
... EUw4$Jt^p
ResultSet rs = ps.executeQuery(); // 查询 ?:vg`m!*
int c = ps.executeUpdate(); // 更新 7vgRNzZoq
iOa<=
3、处理执行结果 3SWDPy
查询语句,返回记录集ResultSet ]kNxytH\o
更新语句,返回数字,表示该更新影响的记录数 {0j,U\ kb
ResultSet的方法 !m\By%(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false u*l>)_HD
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 rIPg,4y*S!
%pg)*>P h
4、释放连接 Z=-#{{bv
cn.close(); AIl`>ac
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection TCzz]?G]la
0 F8xS8vK+
可滚动、更新的记录集 kN 2mPD/
1、创建可滚动、更新的Statement im<!JMI
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); C|H`.|Q
该Statement取得的ResultSet就是可滚动的 gm]q<~eMW
2、创建PreparedStatement时指定参数 ?z)2\D
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +q2\3REzx
ResultSet.absolute(9000); (Ajhf}zJ
批量更新 7202N?a
{
1、Statement LL:N/1ysG
Statement sm = cn.createStatement(); 2O(k@M5E?
sm.addBatch(sql1); UV%o&tv|<
sm.addBatch(sql2); 9i #,V@
...
T\zn&6
sm.executeBatch() ~ xam ;]2
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 miBCq l@x
2、PreparedStatement G8F;fG N
PreparedStatement ps = cn.preparedStatement(sql); Nc6y]eGz
{ *C)m#[#:u
ps.setXXX(1,xxx); o r ~@!
... e+Mm!\;`
ps.addBatch(); SN[yC
} $m>( kd1
ps.executeBatch(); ]nV_K}!w
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ZyU/ .Uk
6;Izw$X
事务的处理 cJT_Qfxx
1、关闭Connection的自动提交 % \v
cn.setAutoCommit(false); k!qOE\%B
2、执行一系列sql语句 5Q}HLjG8Z
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !b K;/)
Statement sm ; 4cm~oZ
sm = cn.createStatement(insert into user...); 6UN{Vjr%`
sm.executeUpdate(); \py&v5J)s!
sm.close(); N<(rP1)`v
sm = cn.createStatement("insert into corp...); ] %7m+-h@
sm.executeUpdate(); !
,]Fx
sm.close(); Qmd2C&Xw
3、提交 '#K~hep
cn.commit(); ZnbpIJ8cV
4、如果发生异常,那么回滚 JKYtBXOl
cn.rollback();