java 数据库基本操作 VUF^ r7e
1、java数据库操作基本流程
6C6<,c
2、几个常用的重要技巧: #QdBI{2
可滚动、更新的记录集 @y,pfWh`
批量更新 aiP.\`>}
事务处理 5c?1JH62o8
$5XE'm
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 >3R)&N
1、取得数据库连接 , VT&
1)用DriverManager取数据库连接 ml=tS,
例子 -nP
y?>p"|
String className,url,uid,pwd; AS[yNCsjC
className = "oracle.jdbc.driver.OracleDriver"; ^O_E
T$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 5 rpX"(
uid = "system"; feOX]g#
pwd = "manager"; qx3@]9
Class.forName(className); w0n.Y-v4i
Connection cn = DriverManager.getConnection(url,uid,pwd); b,]QfC
2)用jndi(java的命名和目录服务)方式 ;eYm+e^?.
例子 29R_?HBH
String jndi = "jdbc/db"; V gLnpPOQ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #.|efdsG
DataSource ds = (DataSource) ctx.lookup(jndi); m22FOjk\
Connection cn = ds.getConnection(); 0fhz7\a^_<
多用于jsp中 E<u6 js,
2、执行sql语句 I^h^QeBis
1)用Statement来执行sql语句 $@t]0
String sql; d>j`|(\
Statement sm = cn.createStatement(); :q_(=EA
sm.executeQuery(sql); // 执行数据查询语句(select) sTx23RJ9
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); K&2{k+w
2)用PreparedStatement来执行sql语句 2H7b2%
String sql; *c<=IcA
sql = "insert into user (id,name) values (?,?)"; IbFS8 *a\
PreparedStatement ps = cn.prepareStatement(sql); JQCQpn/
ps.setInt(1,xxx); H+UA
ps.setString(2,xxx); -%8*>%
... ^m^4LDt
ResultSet rs = ps.executeQuery(); // 查询 }GV5':W@WG
int c = ps.executeUpdate(); // 更新 kk6Af\NZ
15NeC7GAh
3、处理执行结果 iT f]Pd'
查询语句,返回记录集ResultSet S>AM?
更新语句,返回数字,表示该更新影响的记录数 k+
Shhe1
ResultSet的方法 )erI3?k
1、next(),将游标往后移动一行,如果成功返回true;否则返回false QMUmPx&
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6\jhDP@`9
~ ;CnwG
4、释放连接 B(+J?0Dj
cn.close(); N"A863>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection #~(J
J
koQ\]t'*As
可滚动、更新的记录集 no6q3<re
1、创建可滚动、更新的Statement zo!e<>o
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); A.0eeX{
该Statement取得的ResultSet就是可滚动的 O}Y& @V%4k
2、创建PreparedStatement时指定参数 `_`\jd@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {G _ :#cep
ResultSet.absolute(9000); p:kHb@
批量更新 XxXMtiZ6
1、Statement 'Em5AA`>
Statement sm = cn.createStatement(); WCf?_\cG
sm.addBatch(sql1); Npq_1L
sm.addBatch(sql2); =Kf]ZKj)
... vumA W*
sm.executeBatch() ;JQ:S~K9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 q]}fW)r
2、PreparedStatement 'Z^-(xG,+
PreparedStatement ps = cn.preparedStatement(sql); -_<rmR[:]
{ wGRMv1|lIu
ps.setXXX(1,xxx); v/NkG;NWM
... ozF173iI
ps.addBatch(); yHrYSEM
} Rn(6Fk?
ps.executeBatch(); BO6u<cu"-
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g9N_s,3jC
oT=XCa5
事务的处理 EZICH&_
1、关闭Connection的自动提交 kkA5pbS
cn.setAutoCommit(false); y2nwDw(xF
2、执行一系列sql语句 Pe-1o#7~W
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ElBpF8xJ|o
Statement sm ; QQ1|]/)
sm = cn.createStatement(insert into user...); CF|4, K)
sm.executeUpdate(); &x