java 数据库基本操作 .Lp Nm'=R
1、java数据库操作基本流程 {[rO2<MkA#
2、几个常用的重要技巧: |^\Hv5
可滚动、更新的记录集 ``/y=k/au
批量更新 ?cA8P.?^A
事务处理 aslNlH 6
_g^E%@'W
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 oa?!50d
1、取得数据库连接 x*k65WO\
1)用DriverManager取数据库连接 Pi^ECSzQu[
例子 -+`az)lrp
String className,url,uid,pwd; 9 #.<E5:
className = "oracle.jdbc.driver.OracleDriver"; |A2W8b
{]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @DUN;L 4
uid = "system"; 2"B}}
pwd = "manager"; n^3NA|A
Class.forName(className); |
3hT {
Connection cn = DriverManager.getConnection(url,uid,pwd); $a)JCErN
2)用jndi(java的命名和目录服务)方式 kwDjK"
例子 1NB2y[
String jndi = "jdbc/db"; n+:m_2T
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?T$*5d
DataSource ds = (DataSource) ctx.lookup(jndi); :H~UyrN
Connection cn = ds.getConnection(); AD0ptHUBa
多用于jsp中 1
yxZ
2、执行sql语句 -O>^eMWywo
1)用Statement来执行sql语句 +6i7,U
String sql; OYQXi
Statement sm = cn.createStatement();
o9DYr[
sm.executeQuery(sql); // 执行数据查询语句(select) dVjcK/T<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); mRg ,A\
2)用PreparedStatement来执行sql语句 \pT^Zhp)
String sql; $l0eI
sql = "insert into user (id,name) values (?,?)"; nEeQL~:
PreparedStatement ps = cn.prepareStatement(sql); `lH1IA/3
ps.setInt(1,xxx); FCUVP,"T
ps.setString(2,xxx); rQ9?N^&!%
... }L{_xyi>#
ResultSet rs = ps.executeQuery(); // 查询 Y#Sd2h,^X
int c = ps.executeUpdate(); // 更新 3Qm
t]q
q!ulE{ ^
3、处理执行结果 -k|g04Q?
查询语句,返回记录集ResultSet wC4AVJJ^>
更新语句,返回数字,表示该更新影响的记录数 `!5tH?bX
ResultSet的方法 $cp16
1、next(),将游标往后移动一行,如果成功返回true;否则返回false UeutFNp
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 e3oYy#QNk
G!>
iqG
4、释放连接 `[g#Mxw
cn.close(); N{0+C?{_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection )VV4HoH]8
:G6 xJlE|
可滚动、更新的记录集 ~_/<PIm
1、创建可滚动、更新的Statement \Nh^Ig
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); v '"1/% L
该Statement取得的ResultSet就是可滚动的 rH
[+/&w5
2、创建PreparedStatement时指定参数 E.WNykF-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 9Y!0>&o
ResultSet.absolute(9000); DkF@XK0c3
批量更新 Wme1Uid
1、Statement *_<SWTE
Statement sm = cn.createStatement(); TV$\v@\ =
sm.addBatch(sql1); }+QhW]nO{F
sm.addBatch(sql2); 6_ 33*/>=c
... BIHHRCe:@n
sm.executeBatch() \]~kyy
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ePPp)=
2、PreparedStatement 3thG*^C5
PreparedStatement ps = cn.preparedStatement(sql); P^uP$D
{ LRqw\fKk[
ps.setXXX(1,xxx); -=v/p*v0o
... g9grfN
ps.addBatch(); "'&>g4F`o
} d=c1WK
ps.executeBatch(); P_^|KEz
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /S2p ``E+
~Q{[fy=
事务的处理
k=d%.kg
1、关闭Connection的自动提交 6@ (k8<3
cn.setAutoCommit(false); nEZ-h7lzl(
2、执行一系列sql语句 q:D0$YY0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o q'J*6r
Statement sm ; fjz2m
sm = cn.createStatement(insert into user...); m`1}O"<&i
sm.executeUpdate(); r~Is,.zZ}
sm.close(); eaZ)1od
sm = cn.createStatement("insert into corp...); ]
_]6&PZXk
sm.executeUpdate(); -h^} jP8
sm.close(); MU^xu&MB
3、提交 S9F]!m^i
cn.commit(); [/#k$-
4、如果发生异常,那么回滚 {TcbCjyw
cn.rollback();