java 数据库基本操作 NukcBH
1、java数据库操作基本流程 x bsk
2、几个常用的重要技巧: ;B,6v P#
可滚动、更新的记录集 )nI}K QJ<
批量更新 =gYKAr^p5
事务处理 1F*3K3T {
";PW#VHC
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .*3.47O
1、取得数据库连接 }K8W%h<3S
1)用DriverManager取数据库连接 Wvg+5Q
例子 }ob&d.XZ
String className,url,uid,pwd; .w .`1
g
className = "oracle.jdbc.driver.OracleDriver"; S*5hO) C
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; bJ$6[H-:
uid = "system"; oXQzCjX_
pwd = "manager"; R'#1|eWCa
Class.forName(className); cU+%zk
Connection cn = DriverManager.getConnection(url,uid,pwd); iFypKpHg~
2)用jndi(java的命名和目录服务)方式 GO|1O|?
例子 Uzx,aYo X
String jndi = "jdbc/db"; 3/j^Ao\fw
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); S>!
YBzm&X
DataSource ds = (DataSource) ctx.lookup(jndi); KTQy pv
Connection cn = ds.getConnection(); &Ti:IC%M
多用于jsp中 d[p-zn.
2、执行sql语句 rKtr&w7X
1)用Statement来执行sql语句 dE`a1H%
String sql; ^E)*i#."4
Statement sm = cn.createStatement(); %+=y!
sm.executeQuery(sql); // 执行数据查询语句(select) zn=Ifz)#|
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); YEg(QOn3Q
2)用PreparedStatement来执行sql语句 19r4J(pV
String sql; vzr?#FG
sql = "insert into user (id,name) values (?,?)"; Vg>\@ C.s
PreparedStatement ps = cn.prepareStatement(sql); #%=6DHsK
ps.setInt(1,xxx); ;g:!WXd
ps.setString(2,xxx); Q"@x,8xW
... h.~:UR*
ResultSet rs = ps.executeQuery(); // 查询 sghQ!ux
int c = ps.executeUpdate(); // 更新 3\ !DsPgW
9}=]oX!+V
3、处理执行结果 ;F/yS2p
查询语句,返回记录集ResultSet 5 }pn5iI
更新语句,返回数字,表示该更新影响的记录数 cg]\R1Gm
ResultSet的方法
d&@>P&AT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false lVw77bZ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;aY.CgX
MPtn$@
4、释放连接 doERBg`Jh
cn.close(); N>+s8L.?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection G[pDKELL
d,c8ks(
可滚动、更新的记录集 Tx+Bkfj
1、创建可滚动、更新的Statement G>>`j2:y
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Y%i=u:}fm
该Statement取得的ResultSet就是可滚动的 ;`{PA
!>
2、创建PreparedStatement时指定参数 %/K'VE6pb
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); fW'@+<b
ResultSet.absolute(9000);
C,;hNg[
批量更新 ]z%X%wL
1、Statement 5Dhpcgq<<
Statement sm = cn.createStatement(); {D6E@a
sm.addBatch(sql1); >\/H2j
sm.addBatch(sql2); h0=Q .Yz6
... "RkbT O
sm.executeBatch() HkP')= sa
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ib3u:
2、PreparedStatement D^[}:O{
PreparedStatement ps = cn.preparedStatement(sql); C0eqCu)Q
{ YV6@SXy
ps.setXXX(1,xxx); P?zPb'UVqa
... iut[?#f^
ps.addBatch();
^"U-\cx
} _4#8o\
ps.executeBatch(); `Wes!>Vh!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 wU9H=w^
hZ#ydI|
事务的处理 N`G*
h^YQ
1、关闭Connection的自动提交 1feZ`P;
cn.setAutoCommit(false); {hXIP`
2、执行一系列sql语句 \e=Iw"yd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close tiTJ.uz6
Statement sm ; zm&D#)
sm = cn.createStatement(insert into user...); "<#-#j
sm.executeUpdate(); WRq:xDRn0
sm.close(); $RFy9(>
sm = cn.createStatement("insert into corp...); R>r@I_
sm.executeUpdate(); t,YnweH
sm.close(); d'x'hp%
3、提交 Ai~j
q
cn.commit(); 60iMfcT
4、如果发生异常,那么回滚 ~ ~"qT
cn.rollback();