java 数据库基本操作 ,%e.nj9
1、java数据库操作基本流程 Az[Yvu'<
2、几个常用的重要技巧: HcwqVU
可滚动、更新的记录集 1 *'SP6g
批量更新 @ae;&
事务处理 oe,L&2Jz@
;1^_.3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ZP5.?A-=C
1、取得数据库连接 +CtsD9PA
1)用DriverManager取数据库连接 sG*1 ?
例子 o:jLM7$=
String className,url,uid,pwd; xM}lX(V!w
className = "oracle.jdbc.driver.OracleDriver"; @x?7J@:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; v.H00}[.
uid = "system"; 6"C$]kF?
pwd = "manager"; VnW]-P*:
Class.forName(className); tKgPKWP
Connection cn = DriverManager.getConnection(url,uid,pwd); L}lOA,EF
2)用jndi(java的命名和目录服务)方式 |k3ZdM
例子 ),y{.n:wm
String jndi = "jdbc/db"; ((F[]<?
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); IT]D;
DataSource ds = (DataSource) ctx.lookup(jndi); W*iPseXq
Connection cn = ds.getConnection(); tK{2'e6x
多用于jsp中 @SeE,<
2、执行sql语句 4.2qt
1)用Statement来执行sql语句 Z5[TmVU
String sql; F-g(Hk|v
Statement sm = cn.createStatement(); 3\WLm4
sm.executeQuery(sql); // 执行数据查询语句(select) 5fuOl-M0W
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;*ebq'D([
2)用PreparedStatement来执行sql语句 Rf2$k/lZ
String sql; nAv@^G2
sql = "insert into user (id,name) values (?,?)"; *#{[9d
PreparedStatement ps = cn.prepareStatement(sql); 91|=D
\8aE
ps.setInt(1,xxx); fl>*>)6pm
ps.setString(2,xxx); +[@Ug`5M
... 4HEp}Y"}V
ResultSet rs = ps.executeQuery(); // 查询 A$vCm
int c = ps.executeUpdate(); // 更新 j*aN_UTr3
GY 4?}T^s
3、处理执行结果 s,>1n0a
查询语句,返回记录集ResultSet g-j`Ex%
更新语句,返回数字,表示该更新影响的记录数 n}X)a-=
ResultSet的方法 +ew 2+2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (%]&Pe]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4L\bT;dQ|.
zbn0)JO
4、释放连接 ]X/1u"
cn.close(); M6U/.
n
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Qa~dd{?
%cJ]Ds%V
可滚动、更新的记录集 <_&tP=h
1、创建可滚动、更新的Statement wZN<Og+;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); U WYLT-^x
该Statement取得的ResultSet就是可滚动的 5\/h3i"I
2、创建PreparedStatement时指定参数 uV?[eiezD0
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); . fq[>zG'&
ResultSet.absolute(9000); E8#r<=(m
批量更新 Q?rb(u(
1、Statement NMb`d0;(
Statement sm = cn.createStatement(); b$)b/=2
sm.addBatch(sql1); pJ[7m
sm.addBatch(sql2); |u,2A1
... NFTEp0eP
sm.executeBatch() /Y|oDfv
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0kP,Zj<
2、PreparedStatement [P`t8
PreparedStatement ps = cn.preparedStatement(sql); 4{H>V_9zs
{ =BO} hk
ps.setXXX(1,xxx); I;kKY
... RbUBKMZU
ps.addBatch(); m5Gt8Z 6a
} TIlBT{A<
ps.executeBatch(); xh
Sp<|X_
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 e(E6 t_
H@%Y!z@\
事务的处理 6Ouy%]0$I3
1、关闭Connection的自动提交 O@St^o*A}
cn.setAutoCommit(false); DP`$gd
2、执行一系列sql语句 X&EcQ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o =)hUr
Statement sm ; l(|@ dp
sm = cn.createStatement(insert into user...); l?E7'OEF:
sm.executeUpdate(); '#d`K.;_b.
sm.close(); }I_/>58
sm = cn.createStatement("insert into corp...); {X$8yy2zC5
sm.executeUpdate(); `h+ia/
sm.close(); qXmkeidb&W
3、提交 \P% E1c#
cn.commit(); BhC.#u/
4、如果发生异常,那么回滚 yAOYe"d
cn.rollback();