java 数据库基本操作 &>+5
8
1、java数据库操作基本流程 5FuV=Y uc
2、几个常用的重要技巧: J/D~]U
可滚动、更新的记录集 v(R^LqE
批量更新 f+ZOE?"
事务处理 `jR8RDD
4OLYB9HP_
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 j:uq85s
1、取得数据库连接 Gh.?6kuh
1)用DriverManager取数据库连接 AcEz$wy
例子 Tc!n@!RA|
String className,url,uid,pwd; *~4<CP+"0
className = "oracle.jdbc.driver.OracleDriver"; ~8UMwpl-
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; l%('5oz@\
uid = "system"; \1&4wzT
pwd = "manager"; k&:q|[N
Class.forName(className); @aN~97
H\
Connection cn = DriverManager.getConnection(url,uid,pwd); k"%JyO8Y
2)用jndi(java的命名和目录服务)方式 Nt]nwae>A
例子 ^t71${w##
String jndi = "jdbc/db"; J @~g>
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); o3\^9-jmp
DataSource ds = (DataSource) ctx.lookup(jndi); f3n^Sw&Q(Q
Connection cn = ds.getConnection(); t5_76'@cX
多用于jsp中 Z
ztp %2c
2、执行sql语句 y${`W94
1)用Statement来执行sql语句 -hfkF+=U'
String sql; R\X;`ptT
Statement sm = cn.createStatement(); \2[tM/+Bs
sm.executeQuery(sql); // 执行数据查询语句(select) -dF (_ %C
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); B5+Q%)52
2)用PreparedStatement来执行sql语句 rN7JJHV
String sql; )g?jHm-p\
sql = "insert into user (id,name) values (?,?)"; & ^1 b]f
PreparedStatement ps = cn.prepareStatement(sql); ;qy;;usa
ps.setInt(1,xxx); k<j]b^jbz
ps.setString(2,xxx); :-U&_%#w
... @:B}QxC
ResultSet rs = ps.executeQuery(); // 查询 Y@q9
int c = ps.executeUpdate(); // 更新 oiR9NB&<
}+MA*v[06
3、处理执行结果 %-$
:/N
查询语句,返回记录集ResultSet nv+miyvvm
更新语句,返回数字,表示该更新影响的记录数 9@lG{9id?
ResultSet的方法 nj00g>:>
1、next(),将游标往后移动一行,如果成功返回true;否则返回false b?cO+PY01
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 G9xO>Xp^Al
LttA8hf5q?
4、释放连接 js;YSg{m
cn.close(); ,4XOe,WQ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,Xn%0]
p ^TCr<=
可滚动、更新的记录集 ^~TE$i<
1、创建可滚动、更新的Statement ar
7.O;e
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7LM&3mA<
该Statement取得的ResultSet就是可滚动的 iD%a;]
2、创建PreparedStatement时指定参数 |7n%8JsY!"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <h+@;/v:
ResultSet.absolute(9000); B 5qy4MFWs
批量更新 e2G;_:
1、Statement pRxVsOb
Statement sm = cn.createStatement(); IY[qWs
sm.addBatch(sql1); @*L-lx
sm.addBatch(sql2); i"Hc( lg
... 3G 5xIr6
sm.executeBatch() (RrC<5"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 e2tru_#
2、PreparedStatement 5]CaWFSmT
PreparedStatement ps = cn.preparedStatement(sql); +_vf=d
{ =zrfh-lwH
ps.setXXX(1,xxx); @c"s6h&
... eHGx00:
ps.addBatch(); :5&UWL|
} \+/ciPzA-
ps.executeBatch(); thX4-'i
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 E@)'Z6r1
vaHtWz!P
事务的处理 Uc,..
1、关闭Connection的自动提交 a{}#t}
cn.setAutoCommit(false); ps8tr:T^=
2、执行一系列sql语句 'r_Fi5[q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close w8N1-D42
Statement sm ; Y`$\o
sm = cn.createStatement(insert into user...); 50A\Y)i_mZ
sm.executeUpdate(); 0wSy[z4V
sm.close(); f-H"|9
sm = cn.createStatement("insert into corp...); b KIL@AI
sm.executeUpdate(); %qE"A6j
sm.close(); FL^t}vA
3、提交 VK,{Mu=.9
cn.commit(); {[/A?AV;F
4、如果发生异常,那么回滚 ?dv-`)S&
cn.rollback();