java 数据库基本操作 oe<9CK:?>
1、java数据库操作基本流程 6I0G.N
2、几个常用的重要技巧: <!ewb=[_$
可滚动、更新的记录集 3jMHe~.E<
批量更新 ')kn
事务处理 o1x IGP<
Q/oe l'O*x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ai7*</ls
1、取得数据库连接 Ob:}@jj
1)用DriverManager取数据库连接 N/ 7Q(^
例子 (1`z16
String className,url,uid,pwd; 2!Ip!IQ:
className = "oracle.jdbc.driver.OracleDriver"; ZJCD)?]=3
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; C-Q]f
uid = "system"; >7yOu!l
pwd = "manager"; YGRv` `(
Class.forName(className); D^+#RR'#,
Connection cn = DriverManager.getConnection(url,uid,pwd); 86bl'FdKS
2)用jndi(java的命名和目录服务)方式 0^l|W|.Z
例子 L*TPLS[lh
String jndi = "jdbc/db"; %d<uOCf\Q
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); u{F^Ngy
)
DataSource ds = (DataSource) ctx.lookup(jndi); zKycd*X
Connection cn = ds.getConnection(); ykY#Y}?^
多用于jsp中 0'Kbh$LU
2、执行sql语句 N# o" W
1)用Statement来执行sql语句 DA)mkp
String sql; F9DY\EI
Statement sm = cn.createStatement(); [X +E
sm.executeQuery(sql); // 执行数据查询语句(select) 8cq H0{
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 3l?D%E]P
2)用PreparedStatement来执行sql语句 7Sc._G{[%
String sql;
~f/nq/8
sql = "insert into user (id,name) values (?,?)"; cVHv>nd#
PreparedStatement ps = cn.prepareStatement(sql); A#:5b5R
ps.setInt(1,xxx); %y(oY
ps.setString(2,xxx); A^/$ |@
... MO7:ZYq
ResultSet rs = ps.executeQuery(); // 查询 Vo@[
int c = ps.executeUpdate(); // 更新 9,h'cf`F
?T+Uu
3、处理执行结果 Qqt<
查询语句,返回记录集ResultSet %nU8 Ca
更新语句,返回数字,表示该更新影响的记录数 QLx]%E\
ResultSet的方法 s bf\;_!
1、next(),将游标往后移动一行,如果成功返回true;否则返回false FBn`sS8hH
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Ep/kb-~-
[nQ<pTg~r
4、释放连接 cVrses^yE
cn.close(); e0i&?m
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection w Phs1rL
?nW K s
可滚动、更新的记录集 ghXh nxG
1、创建可滚动、更新的Statement Z)RoFD1]C
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 4wLp
该Statement取得的ResultSet就是可滚动的 %i!&Fr
2、创建PreparedStatement时指定参数 &&Sl0(6x[T
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); A"wor\(
ResultSet.absolute(9000); YQU#aOl
批量更新 ET ;=o+\d
1、Statement m2!y;)F0
Statement sm = cn.createStatement(); gwvy$H
sm.addBatch(sql1); dA;f`Bi;Q
sm.addBatch(sql2); c< ke)@
... B^W0Ik`m
sm.executeBatch() yqdhLX|Mk
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |Gc2w]\3
2、PreparedStatement RS'%;B-)
PreparedStatement ps = cn.preparedStatement(sql); &|t*9D
{ Ol8ma`}Nq3
ps.setXXX(1,xxx); j5lSu~
... m791w8Vr
ps.addBatch(); 9UD~$_<\
} %]/O0#E3Kz
ps.executeBatch(); O2[uN@nY
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2jQ|4$9j
0E9LZOw4T
事务的处理 XWQp-H.
1、关闭Connection的自动提交 joa|5v'
cn.setAutoCommit(false); >L6V!
2、执行一系列sql语句 #q`-"2"|
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 1:I47/
Statement sm ; $0[T=9q <+
sm = cn.createStatement(insert into user...); l`s_Id#
sm.executeUpdate(); tOn_S@/r
sm.close(); n !ty\E
sm = cn.createStatement("insert into corp...); L_Q1:nL-0
sm.executeUpdate(); X|Gsf=
1S
sm.close(); e<_p\LiOS
3、提交 ocwh*t)<k
cn.commit(); Eeemy*U
4、如果发生异常,那么回滚 vAW+ ,Rfj
cn.rollback();