java 数据库基本操作 H<ZXe!q(nx
1、java数据库操作基本流程 aHBM9 %gV
2、几个常用的重要技巧: l` ?4O
可滚动、更新的记录集 K<?[^\
批量更新 $c7Utms
事务处理 %Hy.
* a@78&N
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 G u#wH
1、取得数据库连接 @zSj&4
1)用DriverManager取数据库连接 (?kCo
例子 !c=EB`<*
String className,url,uid,pwd; ]`TX%Qni
className = "oracle.jdbc.driver.OracleDriver"; o5< w2(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; N3@gvS
uid = "system"; dW#?{n-H<
pwd = "manager"; =[IKwmCX
Class.forName(className); -'RD%_
Connection cn = DriverManager.getConnection(url,uid,pwd); V*1-wg5>
2)用jndi(java的命名和目录服务)方式 15"[MX A
例子 D<(VP{,G
String jndi = "jdbc/db"; JJu}Ed_
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); (zIF2qY
DataSource ds = (DataSource) ctx.lookup(jndi); ]QmY`pTB`
Connection cn = ds.getConnection(); 1owe'7\J
多用于jsp中 Ct386j><
2、执行sql语句 ;Wig${
1)用Statement来执行sql语句 ~uh,R-Q$
String sql;
>^Y)@J
Statement sm = cn.createStatement(); h#]LXs
sm.executeQuery(sql); // 执行数据查询语句(select) \\$wg
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); JVh/<A
2)用PreparedStatement来执行sql语句 !=(M P:
String sql; .oz(,$CS"
sql = "insert into user (id,name) values (?,?)"; e\ O&Xe
PreparedStatement ps = cn.prepareStatement(sql); js)I%Z
ps.setInt(1,xxx); {z7kW@c
ps.setString(2,xxx); G|)fZQ1nS
... _>i<` k
ResultSet rs = ps.executeQuery(); // 查询 ?oQAxb&
int c = ps.executeUpdate(); // 更新 MTeCmFe0;
tnFhL&
3、处理执行结果 N A9ss
查询语句,返回记录集ResultSet jn#Ok@tZ
更新语句,返回数字,表示该更新影响的记录数 n/Dk~Q)
ResultSet的方法 f}{Oj-:"CC
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |5me }!C
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 5g4xhYl70n
onF?;>[
4、释放连接 TPWqiA?3Cp
cn.close(); Y\{&chuF
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection H263<^
o&Sv2"2
可滚动、更新的记录集 uG7ll5Yy
1、创建可滚动、更新的Statement :hUt7/3c
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); jjJ l\Vn
该Statement取得的ResultSet就是可滚动的 81Ityd-}
2、创建PreparedStatement时指定参数 sr`)l& t?
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Nt_7Z
ResultSet.absolute(9000); 7.7Z|lJ
批量更新 e(Ub7L#
1、Statement lZ5TDS
Statement sm = cn.createStatement(); ?Fj>7
sm.addBatch(sql1); yNN_}9
sm.addBatch(sql2); y jY}o
... k"J=CDP\
sm.executeBatch() )*_n/^m
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 h"ko4b3^'@
2、PreparedStatement #{|F2AM
PreparedStatement ps = cn.preparedStatement(sql); c4xXsUBQk
{ G,A;`:/
ps.setXXX(1,xxx); LJmRa
... IC@-`S#F
ps.addBatch(); Z*lZl8(`
} 2 [yfo8H
ps.executeBatch(); H&=3rkX
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Dv-ubki
&*!) d"
事务的处理 5=9gH
1、关闭Connection的自动提交 vm`\0VGSW
cn.setAutoCommit(false); !-Md+I_
2、执行一系列sql语句 * AjJf)o
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close cO/.(KBF
Statement sm ; R*z:+p}oHy
sm = cn.createStatement(insert into user...); XyytO;XM-
sm.executeUpdate(); G~`nLC^Y
sm.close(); 1J O@G3,
sm = cn.createStatement("insert into corp...); 4-{f$Z@
sm.executeUpdate(); \_PD@A9
sm.close(); &g\?znF]H
3、提交 e?eX9yA7F
cn.commit(); b5d;_-~d
4、如果发生异常,那么回滚 p_l.a
cn.rollback();