java 数据库基本操作 }z9v*C
1、java数据库操作基本流程 GZx*A S]+
2、几个常用的重要技巧: eAP
8!
可滚动、更新的记录集 z"QtP[_m
批量更新 uxKO"
事务处理 Z'5&N5hx
s7:_!Nd@8
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 y>h9:q|
1、取得数据库连接 "u$XEA
1)用DriverManager取数据库连接 /D|q-`*K
例子 s]A8C^;c
String className,url,uid,pwd; >fT%CGLC0
className = "oracle.jdbc.driver.OracleDriver"; xbcmvJrG
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; hHDLrr
uid = "system"; bJ6C7-w:wa
pwd = "manager"; >6WZSw/Hq
Class.forName(className); ?D9iCP~~
Connection cn = DriverManager.getConnection(url,uid,pwd); hG<[F@d
2)用jndi(java的命名和目录服务)方式 -nUK%a"(D
例子 b-@9Xjv
String jndi = "jdbc/db"; CsT&}-C
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
8sI$
DataSource ds = (DataSource) ctx.lookup(jndi); XMP4YWuVc
Connection cn = ds.getConnection(); #^aa&*<D_
多用于jsp中 sc# EL~
2、执行sql语句 !z2xm3s{]p
1)用Statement来执行sql语句 .tHc*Eh
String sql; 7cB{Iq0+
Statement sm = cn.createStatement(); GCw4sb4~w
sm.executeQuery(sql); // 执行数据查询语句(select) 0SIUp/.
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {<}Hut:a
2)用PreparedStatement来执行sql语句 \WdSj
String sql; c`S+>:
sql = "insert into user (id,name) values (?,?)"; v,~fG>Y}
PreparedStatement ps = cn.prepareStatement(sql); +`mI\+y,
ps.setInt(1,xxx); 2Ir*}s2{
ps.setString(2,xxx); e$Yvy>I'tS
... G^VOA4
ResultSet rs = ps.executeQuery(); // 查询 Sj/v:
int c = ps.executeUpdate(); // 更新 F9las#\J
s?9Y3]&+&M
3、处理执行结果 #k>A,
查询语句,返回记录集ResultSet L>7@!/9L
更新语句,返回数字,表示该更新影响的记录数 qJonzFp7
ResultSet的方法 \x4:i\Fx@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false D Vg$rm`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }[@Q**j(
W
9}xfy09
4、释放连接 cud9oJ-=;
cn.close(); 7D 3-/_ v
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection >/}p{Tj
s!MD8ia
可滚动、更新的记录集 %WmTG }L)
1、创建可滚动、更新的Statement <*u^8lCA
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); @;hdZLG]`&
该Statement取得的ResultSet就是可滚动的 `*kl> }$
2、创建PreparedStatement时指定参数 i<tJG{A=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !SnLvW89Z
ResultSet.absolute(9000); '<ZHzDW@
批量更新 kou7_4oS
1、Statement 8s[1-l
Statement sm = cn.createStatement(); ${wp}<u_
sm.addBatch(sql1); &?xmu204
sm.addBatch(sql2); /yY} .S
... ){eQ.yW
sm.executeBatch() L=HnVgBs
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 W*(- *\1[
2、PreparedStatement S^EAE]
PreparedStatement ps = cn.preparedStatement(sql); ` ` Yk
{ &U}8@;
ps.setXXX(1,xxx); W|n$H`;R
... Z8Vof~
ps.addBatch(); yUxz,36wZ
} Q^@7Yg@l
ps.executeBatch(); : vgn0IQ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 aiE\r/k8s
<X& fs*x&
事务的处理 vMJ(Ll7/
1、关闭Connection的自动提交 GM)q\Hx{
cn.setAutoCommit(false); 5U]@
Y?
2、执行一系列sql语句 6zNWDUf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Y"s8j=1m
Statement sm ; Pq(LW(
sm = cn.createStatement(insert into user...); cyabqx
sm.executeUpdate(); i`vy<Dvpz
sm.close(); utC^wA5U~
sm = cn.createStatement("insert into corp...); 7&%#bMnw
sm.executeUpdate(); l2dj GZk
sm.close(); cF9oo%3
3、提交 (mI590`f
cn.commit(); ^mC,Z+!
4、如果发生异常,那么回滚 tc\ZYCFr
cn.rollback();