java 数据库基本操作 -5A@FGh
1、java数据库操作基本流程 8oY0?|_Bx
2、几个常用的重要技巧: tkWWR%c"
可滚动、更新的记录集 knypSgk_
批量更新 ~s{$&N
事务处理 oZ%t! Fl1
rQK2&37-,@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9Dd/g7
1、取得数据库连接 }6eWdm!B
1)用DriverManager取数据库连接 n$}c+1
例子 P/t$xqAL
String className,url,uid,pwd; A]BD2
className = "oracle.jdbc.driver.OracleDriver"; NF0} eom
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 2P9h x5PiV
uid = "system"; NS=puo
pwd = "manager"; $$\| 3rj!
Class.forName(className); 0;e>kz3o
Connection cn = DriverManager.getConnection(url,uid,pwd); xYRL4
2)用jndi(java的命名和目录服务)方式 LL-MZ~ZB
例子 \J0gzi.
String jndi = "jdbc/db"; hvGb9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); g{ l;v
DataSource ds = (DataSource) ctx.lookup(jndi); x!!:jL'L
Connection cn = ds.getConnection(); H5/%"1Q
多用于jsp中 O>w$
2、执行sql语句 2N(c&Dzkh`
1)用Statement来执行sql语句 H"I|dK :
String sql; u9m"{KnV
Statement sm = cn.createStatement(); 9ZG.%+l
sm.executeQuery(sql); // 执行数据查询语句(select) xgJ2W_
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); z-(dT
2)用PreparedStatement来执行sql语句 blaxUP:
String sql; Z/hSH
0 (~
sql = "insert into user (id,name) values (?,?)"; fYx$3a.
PreparedStatement ps = cn.prepareStatement(sql); m+DkO{8F
ps.setInt(1,xxx); WJe
ps.setString(2,xxx); vyqlP;K
... ^l_W9s
ResultSet rs = ps.executeQuery(); // 查询 BWL~)Hx
int c = ps.executeUpdate(); // 更新 qVJV 9n
IcPIOCmOc
3、处理执行结果 rtf>\j+
查询语句,返回记录集ResultSet K*;=^PY
更新语句,返回数字,表示该更新影响的记录数 X"8Jk4y
ResultSet的方法 E'Egc4Z2=l
1、next(),将游标往后移动一行,如果成功返回true;否则返回false x1+8f2[
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Fg5c;sls
CbS9fc&
4、释放连接 |,t#Au}61
cn.close(); fVo)# Bj
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Y.F:1<FAtf
6P?
可滚动、更新的记录集 ]t7<$L
1、创建可滚动、更新的Statement dB_\0?jJ-
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]O7I7K
该Statement取得的ResultSet就是可滚动的 qN+ ngk,:
2、创建PreparedStatement时指定参数 33[2$FBf
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); wvJm)Mj+
ResultSet.absolute(9000); hV'JTU]H
批量更新 #12PO q
1、Statement $+S'Boo
Statement sm = cn.createStatement(); l4hC>q$T
sm.addBatch(sql1); '!{zO"
1*
sm.addBatch(sql2); C#>c(-p>RC
... zWB>;Z}
sm.executeBatch() 292e0cE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
5 ah]E
2、PreparedStatement FB6`2E%o
PreparedStatement ps = cn.preparedStatement(sql); ~+QfP:G
{ mWUQF"q8
ps.setXXX(1,xxx); |CY.Y,
... h3>/..l
ps.addBatch(); fX#Em'Ab[
} ?8b?{`@V
ps.executeBatch(); `dn|nI2
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 U`IDZ{g
GvF~h0wMt
事务的处理 =<iK3bPkU
1、关闭Connection的自动提交 ?o),F^ir
cn.setAutoCommit(false); 0j7\.aaK
2、执行一系列sql语句 :s$ rD
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %@kmuz??
Statement sm ; V8`t7[r
sm = cn.createStatement(insert into user...); PRWS[2[yk
sm.executeUpdate(); 2m[z4V@`
sm.close(); E]6;nY?
sm = cn.createStatement("insert into corp...); C:l
/%
sm.executeUpdate(); I
r<5%
sm.close(); e6QUe.S
3、提交 b)3dZ*cOJ
cn.commit(); <k6Zx-6X<
4、如果发生异常,那么回滚 `kVy1WiY
cn.rollback();