java 数据库基本操作 =6<w'>
1、java数据库操作基本流程 &8+6!TN7
2、几个常用的重要技巧: P9"D[uz
可滚动、更新的记录集 ] ZGvRA&
批量更新 0ITA3v8{
事务处理 E#$_uZ4
pq?[ wp"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :Q
?J}N
1、取得数据库连接 Mc7 <[a
1)用DriverManager取数据库连接 |M<.O~|D6}
例子 h:jI
String className,url,uid,pwd; ZqbM%(=z(`
className = "oracle.jdbc.driver.OracleDriver"; 1mn$Rh&dO
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; C}=_8N
uid = "system"; h2|vB+W-
pwd = "manager"; 9U9c"'g
Class.forName(className); .;Utkf'I
Connection cn = DriverManager.getConnection(url,uid,pwd); Z#Zzi5<
2)用jndi(java的命名和目录服务)方式 _jrA?pY
例子 Z"~6yF
String jndi = "jdbc/db"; ,}IER
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]2\2/~l
DataSource ds = (DataSource) ctx.lookup(jndi); xUo)_P\_
Connection cn = ds.getConnection(); ys[i`~$
多用于jsp中 |<3Q+EB^
2、执行sql语句 K;y\[2;}e,
1)用Statement来执行sql语句 OpbT63@L
String sql; TXD^Do5^
Statement sm = cn.createStatement(); %*5g<5
sm.executeQuery(sql); // 执行数据查询语句(select) _"!{7e`Z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); |t 65#1
2)用PreparedStatement来执行sql语句 :*P___S=
String sql; oyN+pFVB:$
sql = "insert into user (id,name) values (?,?)"; ccN &h
PreparedStatement ps = cn.prepareStatement(sql); /cL9?k;o
ps.setInt(1,xxx); FJjF*2 .
ps.setString(2,xxx); TtwJ,&b
... /[|}rqX(
ResultSet rs = ps.executeQuery(); // 查询 Ag>>B9
int c = ps.executeUpdate(); // 更新 ;%rs{XO9
+wz`_i)!
3、处理执行结果 Sa[EnC
查询语句,返回记录集ResultSet p*AP 'cR
更新语句,返回数字,表示该更新影响的记录数 N}+B:l]Qy
ResultSet的方法 G{:af:5Fo
1、next(),将游标往后移动一行,如果成功返回true;否则返回false v;bM.OL
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 t)oES>W1
uF]D
4、释放连接 .}$`+h8WT
cn.close(); 0K$WSGB?6j
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 3d#9Wyxs
A|
gs Uh
可滚动、更新的记录集 o}mhy`}
1、创建可滚动、更新的Statement [I++>4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ZM-/n>
该Statement取得的ResultSet就是可滚动的 c+E//X|
2、创建PreparedStatement时指定参数 DV7<n&P
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (}*\ {
ResultSet.absolute(9000); s=q%:uCO
批量更新 ]s*[Lib
1、Statement ~51kiQW
Statement sm = cn.createStatement(); w>z8c3Dq}
sm.addBatch(sql1); nj~$%vmA
sm.addBatch(sql2); Jm]]>K8.3V
... (b`4&sQ<
sm.executeBatch() |i}+t
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 \]f5
2、PreparedStatement mJGO)u&
PreparedStatement ps = cn.preparedStatement(sql); V(lK`dY
{ GG@I!2,_
ps.setXXX(1,xxx); YoV^xl6g
... 7zJrT5
ps.addBatch(); F,L82N6\U
} R<y Nv
ps.executeBatch(); ,`%k'ecN
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 q19k<BqR
`r~`N`o5A
事务的处理 _:ZFCDO
1、关闭Connection的自动提交 Yn IM-
cn.setAutoCommit(false); ~>N`<S
2、执行一系列sql语句 mc0sdb,c$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 3ZW/$KP/
Statement sm ; nJldz;
sm = cn.createStatement(insert into user...); Y91
e1PsV
sm.executeUpdate(); `zElBD
sm.close(); Pg*?[^*
sm = cn.createStatement("insert into corp...); abTDa6 /`v
sm.executeUpdate(); Edf=?K+\!i
sm.close(); g33<qYxP
3、提交 XI%RneuDr:
cn.commit(); +X* F<6mZ
4、如果发生异常,那么回滚 ' D)1ka.
cn.rollback();