java 数据库基本操作 jRgv
8n
1、java数据库操作基本流程 ;K:.*sAa
2、几个常用的重要技巧: VLQfuh;
可滚动、更新的记录集 'BUdySng
批量更新 ^]aDLjD
事务处理 P6IhpB59
(5Cm+Sy
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 eQC`e#%
1、取得数据库连接 _k
~bH\(
1)用DriverManager取数据库连接 3!Be kn]
例子 &,e@pv c3
String className,url,uid,pwd; }]g>PY
className = "oracle.jdbc.driver.OracleDriver"; ?+5K2Zk
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~hM4({/QN
uid = "system"; c-s ~q/
pwd = "manager"; ->93.sge
Class.forName(className); snj+-'4T
Connection cn = DriverManager.getConnection(url,uid,pwd); A1YIPrav(
2)用jndi(java的命名和目录服务)方式 z&-3H/
例子 @x{;a 9y
String jndi = "jdbc/db"; "]JS,g {m
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )0UQy#r
DataSource ds = (DataSource) ctx.lookup(jndi); I}?fy\1A&
Connection cn = ds.getConnection(); p&ZD1qa
多用于jsp中 :T'"%_d5
2、执行sql语句
Rl6E
1)用Statement来执行sql语句 lW>bXC
String sql; a
nIdCOh
Statement sm = cn.createStatement(); |@d7o]eM|
sm.executeQuery(sql); // 执行数据查询语句(select) <PfW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); '<XG@L
2)用PreparedStatement来执行sql语句 n*_FC
String sql; ri\r%x
sql = "insert into user (id,name) values (?,?)"; {},GxrQm
PreparedStatement ps = cn.prepareStatement(sql); E-!`6
ps.setInt(1,xxx); !FO||z(vb
ps.setString(2,xxx); s q :ff
... pLk?<y
ResultSet rs = ps.executeQuery(); // 查询 t,=khZ
int c = ps.executeUpdate(); // 更新 ?rr%uXQjH
E@[`y:P
3、处理执行结果 eb+[=nmP
查询语句,返回记录集ResultSet Jh }3AoD
更新语句,返回数字,表示该更新影响的记录数 (wbG0lu
ResultSet的方法 O<o_MZN
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &4BN9`|:
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 d3Y#_!)
E5 Y92vu
4、释放连接 ]2Lwd@
cn.close(); [qid4S~r,&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &LYU#$sj
D+"5R5J",
可滚动、更新的记录集 /4=O^;
1、创建可滚动、更新的Statement e'7!aysj
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #M8"b]oh6
该Statement取得的ResultSet就是可滚动的 GS)l{bS#[O
2、创建PreparedStatement时指定参数 Y{2\==~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); .s,hl(w,
ResultSet.absolute(9000); #<!oA1MH4
批量更新 r%TgZ5~u
1、Statement <\yM{
V\
Statement sm = cn.createStatement(); bh_i*DJ]
sm.addBatch(sql1); e
`_ [+y
sm.addBatch(sql2); r$.ek\D5
... k*lrE4::a
sm.executeBatch() v( (fRX.`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 *4+;Ey
2、PreparedStatement BU])@~$
PreparedStatement ps = cn.preparedStatement(sql); qFvtqv2
{ m:
w/[|_
ps.setXXX(1,xxx); :Fm+X[n
... Pm;"Y!S<
ps.addBatch(); #PtV=Ee1
} ,hX03P-X
ps.executeBatch(); J6::(0HM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7G2TT a
l} h<2
事务的处理 YMJjO0
1、关闭Connection的自动提交 i mJ{wF
cn.setAutoCommit(false); pspV~9,
2、执行一系列sql语句 ^V>sNR
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6)DYQ^4y
Statement sm ; c< \:lhl
sm = cn.createStatement(insert into user...); I_eYTy-a`1
sm.executeUpdate(); b/ur!2yr
sm.close(); Ku&0bXP
sm = cn.createStatement("insert into corp...); OGh bH a
sm.executeUpdate(); v>0xHQD*<M
sm.close(); TX8,+s+
3、提交 @\[&_DZ
cn.commit(); %.[GR
4、如果发生异常,那么回滚 >dZ x+7
cn.rollback();