java 数据库基本操作 3(N$nsi
1、java数据库操作基本流程 lb3bm)@:
2、几个常用的重要技巧: xm~`7~nFR
可滚动、更新的记录集 An0|[ uWH
批量更新 \?-<4Bc@
事务处理 !>o7a}?
J!(<y(l
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 G>}255qY
1、取得数据库连接 .2t4tb(SUw
1)用DriverManager取数据库连接 L`TLgH&?R
例子 U'_Q>k
String className,url,uid,pwd; &
J'idYD
className = "oracle.jdbc.driver.OracleDriver"; WE#^a6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; V2EUW!gn
2
uid = "system"; f'RX6$}\1X
pwd = "manager"; 'JE`(xD
Class.forName(className); \*?~Yj#
Connection cn = DriverManager.getConnection(url,uid,pwd); Ic<2QknmP
2)用jndi(java的命名和目录服务)方式 Wvh#:Z
例子 ebhXak[w
String jndi = "jdbc/db"; Q3~H{)[Kq
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Nh|uO?&C6
DataSource ds = (DataSource) ctx.lookup(jndi); ; DR$iH-F
Connection cn = ds.getConnection(); t{9GVLZ
多用于jsp中 0Mm)`!TLSW
2、执行sql语句 eo?bL$A[s
1)用Statement来执行sql语句 ;igIZ$&
String sql; c)85=T6*aA
Statement sm = cn.createStatement(); ^{`exCwMx
sm.executeQuery(sql); // 执行数据查询语句(select) q.bSIV|
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ="H`V V_
2)用PreparedStatement来执行sql语句 :3Ox~o
String sql; 4pF*"B
sql = "insert into user (id,name) values (?,?)"; M|h3Wt~7
PreparedStatement ps = cn.prepareStatement(sql); ;$|nrwhy
ps.setInt(1,xxx); \gaw6S>n}
ps.setString(2,xxx); Wn2NMXK
... @Nx9)
ResultSet rs = ps.executeQuery(); // 查询 hn@08t G
int c = ps.executeUpdate(); // 更新 U7F!Z(
9
KV *#T20T
3、处理执行结果 JH9J5%sp
查询语句,返回记录集ResultSet S%>]q
s
更新语句,返回数字,表示该更新影响的记录数 T!#GW/?
ResultSet的方法 + &Eqk
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Zu[su>\
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6nvz8f3*r]
#c!lS<z
4、释放连接 Lk8ek}o'
cn.close(); $6 f3F?y7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cm+Es6;
TD0
B%
可滚动、更新的记录集 Wac&b
1、创建可滚动、更新的Statement XpHrt XD
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); va@Lz&sAE%
该Statement取得的ResultSet就是可滚动的 k4J+J.|
2、创建PreparedStatement时指定参数 !F$6-0%
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); gwMNYMI
ResultSet.absolute(9000); SqpaFWr
批量更新
=:pJ
1、Statement 8nV+e~-w
Statement sm = cn.createStatement(); "!^"[mX4
sm.addBatch(sql1); CA~-rv
sm.addBatch(sql2); q<1~ vA9
... R-$!9mnr
sm.executeBatch() _Fl9>C"u
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 U[MA)41
2、PreparedStatement )ez9"# MH'
PreparedStatement ps = cn.preparedStatement(sql); 99QU3c<.
{ 3=j"=-=
ps.setXXX(1,xxx); ~f98#43
... kl:Bfs)b
ps.addBatch(); /U9"wvg
} f]CXu3w(J
ps.executeBatch(); h:|qC`}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 wmLs/:~
VI86KJu
事务的处理 ^
Ze=uP
1、关闭Connection的自动提交 q/,O\,
cn.setAutoCommit(false); Q;rX;p^W
2、执行一系列sql语句 "chDg(jMZ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close kuP(r
Statement sm ; sXPe/fWo
sm = cn.createStatement(insert into user...); S,he6zS
sm.executeUpdate(); ?UoBV$
sm.close(); |CyE5i0
sm = cn.createStatement("insert into corp...); 4kx
N<]
sm.executeUpdate(); 9yP;@y*d
sm.close(); 'H;*W |:-]
3、提交 iH@UTE ;
cn.commit(); Avb\{)s+
4、如果发生异常,那么回滚 '`Hr}
cn.rollback();