java 数据库基本操作 RCsQLKqF
1、java数据库操作基本流程 z:u e]7(.
2、几个常用的重要技巧: I:P/
?-
可滚动、更新的记录集 WtN o@e'
批量更新 ;dPyhR
事务处理 ;sE;l7
)(oRJu)y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 @SF*Kvb&
1、取得数据库连接 4yV}4f$q
1)用DriverManager取数据库连接 : P>Wd3m
例子 f]tc$`vb
String className,url,uid,pwd; qt=gz6!
className = "oracle.jdbc.driver.OracleDriver"; |2,u!{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; G'^Qi}o
uid = "system"; ^w5`YI4<
pwd = "manager"; V:4]]z L}
Class.forName(className); th}Q`vg0
Connection cn = DriverManager.getConnection(url,uid,pwd); t|0Zpp;
2)用jndi(java的命名和目录服务)方式 ^G.PdX$M
例子 2j9Mr
String jndi = "jdbc/db"; '2vZ%C$
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ypM0}pdvTp
DataSource ds = (DataSource) ctx.lookup(jndi); x6d+`4
Connection cn = ds.getConnection(); {9q~bt
多用于jsp中 ykrb/j|rK
2、执行sql语句 %>_ZUu3M
1)用Statement来执行sql语句 ]x8^s
String sql; AifnC4
Statement sm = cn.createStatement(); YDE;mIW
sm.executeQuery(sql); // 执行数据查询语句(select) M.O3QKU4
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); IGeXj%e
2)用PreparedStatement来执行sql语句 (, Il>cR4
String sql; .uG|Vq1v
sql = "insert into user (id,name) values (?,?)"; 494"-F 6
PreparedStatement ps = cn.prepareStatement(sql); `rzgC \
ps.setInt(1,xxx); p^_2]%,QeM
ps.setString(2,xxx); &k*sxW'
... wWB-P6
ResultSet rs = ps.executeQuery(); // 查询 yANk(
int c = ps.executeUpdate(); // 更新 i1e|UR-wl
Squ'd
3、处理执行结果 '!>LF1W=
查询语句,返回记录集ResultSet 2fM*6CaS
更新语句,返回数字,表示该更新影响的记录数 U6;,<-bL
ResultSet的方法 bx`s;r=
1、next(),将游标往后移动一行,如果成功返回true;否则返回false tn&~~G~#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8x#SpDI
5TqB&GP0
4、释放连接 :QT0[P5O
cn.close(); 0l=g$G
\%
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection G[z!;Zuf
owHhlS{
可滚动、更新的记录集 9(g?{ 6v|
1、创建可滚动、更新的Statement I]t ",s/j
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); uH7$/
该Statement取得的ResultSet就是可滚动的 T2|dFKeWG
2、创建PreparedStatement时指定参数 !)~b Un
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); .Az'THD}
ResultSet.absolute(9000); wiKUs0|
批量更新 MO|aN,
1、Statement [}Vne;V
Statement sm = cn.createStatement(); `./$hh
sm.addBatch(sql1); W9nmTz\8
sm.addBatch(sql2); 2x%Xx3!
... b2]1Dfw
sm.executeBatch() Qxr&zT7f
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #\U;,r
2、PreparedStatement wN'Q\l+
PreparedStatement ps = cn.preparedStatement(sql); <2@V$$Qg.~
{ <3i2(k
ps.setXXX(1,xxx); ;/T=ctIs
... N) D;)ZH
ps.addBatch(); n\Y{?x
} r!A1Sfo4P
ps.executeBatch(); ^GMM%
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 `IL''eJug_
\@8j&],dl
事务的处理 Rg@W0Bc)
1、关闭Connection的自动提交 Y|$3%t
cn.setAutoCommit(false); Q'xZ\t
2、执行一系列sql语句 *F7ksLH|q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close AG/?LPJ
Statement sm ; OE_;i}58
sm = cn.createStatement(insert into user...); F*Lm=^:
sm.executeUpdate(); RS'!>9I
sm.close(); }j9V0`Q
sm = cn.createStatement("insert into corp...); 1Z-f@PoM
sm.executeUpdate(); J<J_yRg2
sm.close(); !;EG<ji,gj
3、提交 zQvp<IUq
cn.commit(); ]@YBa4}w
4、如果发生异常,那么回滚 5R"My^G
cn.rollback();