java 数据库基本操作 (%IstR|u:
1、java数据库操作基本流程 ba1QFzN
2、几个常用的重要技巧: 30v1VLR_)
可滚动、更新的记录集 2"K~:Tm#w
批量更新 CxN@g'
事务处理 Z]+Xh
2F(\ }%UT~
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Iur} ZAz
1、取得数据库连接 1{glRY'
1)用DriverManager取数据库连接 |,~A9
例子 cG"<*Xi <
String className,url,uid,pwd; n>+W]I&E
className = "oracle.jdbc.driver.OracleDriver"; q&S.C9W
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; H;te)km}
uid = "system"; TZ]Gl4@
pwd = "manager"; x%7x^]$
Class.forName(className); P@![P Ij
Connection cn = DriverManager.getConnection(url,uid,pwd); bL[W.O0
2)用jndi(java的命名和目录服务)方式 g2_df3Q
例子
} R6h
String jndi = "jdbc/db"; 7lOiFw
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); %),O9*[9
DataSource ds = (DataSource) ctx.lookup(jndi); 7ZnQ] ?
Connection cn = ds.getConnection(); Q9V4-MC9
多用于jsp中 Z'kYf
2、执行sql语句 e;3 (,
1)用Statement来执行sql语句 s*WfRY*=V
String sql; DKCy h`
Statement sm = cn.createStatement(); LJ#P- `!{&
sm.executeQuery(sql); // 执行数据查询语句(select) LA Vgf>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); nxRrmR}F
2)用PreparedStatement来执行sql语句 / /rWc,c
String sql; ~q>ilnL"h
sql = "insert into user (id,name) values (?,?)"; MUl+Oy>
PreparedStatement ps = cn.prepareStatement(sql); 5!%/j,?
ps.setInt(1,xxx); Q{-r4n|b
ps.setString(2,xxx); sVnuSm
... )gF9D1eA
ResultSet rs = ps.executeQuery(); // 查询 #| Po&yu4R
int c = ps.executeUpdate(); // 更新 03;(v%
R>q'Y mu~
3、处理执行结果 0:8'Ov(
查询语句,返回记录集ResultSet L
*@>/N
更新语句,返回数字,表示该更新影响的记录数 L+CSF ]
ResultSet的方法 6w,xb&S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false sl 5wX
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :gtwvM7/B
5+Ut]AL5
4、释放连接 S22 ;g
cn.close(); jT0fF
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ZQ/5]]}3y
']D( ({%g
可滚动、更新的记录集 vt,X:3
1、创建可滚动、更新的Statement hn.fX:}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); tDkqwF),
该Statement取得的ResultSet就是可滚动的 t|lv6-Hy9
2、创建PreparedStatement时指定参数 >?KyPp
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); W&#Nk5d
ResultSet.absolute(9000); ^Pwq`G A
批量更新 `rV,<
1、Statement us+adS.l&
Statement sm = cn.createStatement(); 'fsOKx4Z
sm.addBatch(sql1); h,g~J-x`|
sm.addBatch(sql2); Q1yTDJ(2
... ER+[gT1CQ
sm.executeBatch() 2F(j=uV+
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 )M~5F,)
2、PreparedStatement g9JtWgu
PreparedStatement ps = cn.preparedStatement(sql); 3u<2~!sR
{ ?9"glzxr
ps.setXXX(1,xxx); ImVe71mh
... x1h!_^(QfF
ps.addBatch(); #oI`j
q
} S;~_9i]upe
ps.executeBatch(); !;-x]_
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 u9Ro=#xt
2~ a4ib
事务的处理 RP$A"<goP
1、关闭Connection的自动提交 T5)?6i-N
cn.setAutoCommit(false); /~:ztv\$M"
2、执行一系列sql语句 $fKWB5p|()
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close *h1@eJHMz
Statement sm ; gqG"t@Y+
sm = cn.createStatement(insert into user...); rxA<\h,A
sm.executeUpdate(); Aj_}B.
sm.close(); sr4K-|@
sm = cn.createStatement("insert into corp...); M=%p$\x
sm.executeUpdate(); aU@z\sQ
sm.close(); _+i-)
3、提交 w]}vm-
cn.commit(); ,7aqrg
4、如果发生异常,那么回滚 O{PRK5 ^h
cn.rollback();