java 数据库基本操作 kuWK/6l4
1、java数据库操作基本流程 "|(rVj=
2、几个常用的重要技巧: K~`n}_:
可滚动、更新的记录集 #DQX<:u
批量更新 ?(fQ<i n
事务处理 >]:N?[Y_~}
\Y51KB\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 I~d#p ]>
1、取得数据库连接 F9Ifw><XM
1)用DriverManager取数据库连接 mGt\7&`
例子 [u/zrpTk
String className,url,uid,pwd; kyy0&L
className = "oracle.jdbc.driver.OracleDriver"; QpdujtH`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; bc
`UA
uid = "system"; Tg3:VD
pwd = "manager"; <I>%m,
Class.forName(className); =@Q#dDnFu%
Connection cn = DriverManager.getConnection(url,uid,pwd); ,Adus M
2)用jndi(java的命名和目录服务)方式 ]jHgo](%
例子 ,:v.L}+Z
String jndi = "jdbc/db"; X*TuQ\T
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); L{cK^ ,
DataSource ds = (DataSource) ctx.lookup(jndi); ^;0~6uBEJr
Connection cn = ds.getConnection(); H @_eFlT t
多用于jsp中 4$0jz'
2、执行sql语句 A Oby*c
1)用Statement来执行sql语句 A8\U
CG
String sql; @`w'
Statement sm = cn.createStatement(); B.]qrS|
sm.executeQuery(sql); // 执行数据查询语句(select) -s9 Y(>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 1;cv-W
2)用PreparedStatement来执行sql语句 r{pI-$
String sql; UiJ^~rn
sql = "insert into user (id,name) values (?,?)"; *Gg1h@&
PreparedStatement ps = cn.prepareStatement(sql); di-O*ug
ps.setInt(1,xxx); Aivu %}_|
ps.setString(2,xxx); _ff=B
... DCEvr" (
ResultSet rs = ps.executeQuery(); // 查询 ]NaMZ
int c = ps.executeUpdate(); // 更新 y3&Tv
c'4>D,?1
3、处理执行结果 @?<N +qdH>
查询语句,返回记录集ResultSet &/B2)l6a
更新语句,返回数字,表示该更新影响的记录数 yf
`.%
ResultSet的方法 3S[w'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false xaGVu0q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 T^/Gj|N*
z1Bj_u{
4、释放连接 LL|_c4$Ky
cn.close(); 4q\.I+r^
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection qWRNHUd
:N^@a-
可滚动、更新的记录集 NWo7wVwc/c
1、创建可滚动、更新的Statement Ybs=W<-
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 844tXMtPB\
该Statement取得的ResultSet就是可滚动的 vDu0
2、创建PreparedStatement时指定参数 tb-OKZq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); uB5h9&57
ResultSet.absolute(9000); a<OCO0irJ
批量更新 ](B&l{V
1、Statement [47K7~9p
Statement sm = cn.createStatement(); ^>,<*p
sm.addBatch(sql1); tx:rj6-z
sm.addBatch(sql2); jw:4fb
... h]J&A
sm.executeBatch() r*X}3t*
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 D%c7JK
2、PreparedStatement w?V[[$
PreparedStatement ps = cn.preparedStatement(sql); p/\$P=
{ JLy)}8I
ps.setXXX(1,xxx); w5dIk]T
... d8Q_6(Ar|
ps.addBatch(); XBfia j
} ,W)IVc
ps.executeBatch(); q|47;bK'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 z;fd#N:
~pd1)
事务的处理 bR>o!(M'Z\
1、关闭Connection的自动提交 *_4n2<W$
cn.setAutoCommit(false); `nd#< w>
2、执行一系列sql语句 p|bc=`TD
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close GL;x:2XA
Statement sm ; mV:RmA
sm = cn.createStatement(insert into user...); r85Xa'hh
sm.executeUpdate(); ,?0-=o
sm.close(); BNL8hK`D
sm = cn.createStatement("insert into corp...); L}e"nzTE6I
sm.executeUpdate(); <B]i80.
sm.close(); Dyouk+08x
3、提交 1jUhG2y
cn.commit(); j=xtnIq
4、如果发生异常,那么回滚 (n":]8}
cn.rollback();