java 数据库基本操作 L
R\LC6kM
1、java数据库操作基本流程 gW,hI>
2、几个常用的重要技巧: lxm/*^
可滚动、更新的记录集 R8cOb*D
批量更新 D<m0G]Ht*
事务处理 X@"G1j >/
mU]VFPr5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [ /YuI@C,@
1、取得数据库连接 \ )=WA!
1)用DriverManager取数据库连接 xorafL
例子 qm3H/cC9+
String className,url,uid,pwd; 4EHrd;|
className = "oracle.jdbc.driver.OracleDriver"; >1(J
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; hJ$9Hb
uid = "system"; M+0PEf.
pwd = "manager"; \nt~K}a
Class.forName(className); )q[P&f(h
Connection cn = DriverManager.getConnection(url,uid,pwd); {9yf0n
2)用jndi(java的命名和目录服务)方式 BY.k.]/
例子 V
^+p:nP
String jndi = "jdbc/db"; J*[@M*R;&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4Wp5[(bg
DataSource ds = (DataSource) ctx.lookup(jndi); r=&,2meo
Connection cn = ds.getConnection(); qXg&E}]:=
多用于jsp中 'S1u@p,q
2、执行sql语句 G[\TbPh
1)用Statement来执行sql语句 Z;%uDlcXI
String sql; *X(:vET
Statement sm = cn.createStatement(); X%+lgm+
sm.executeQuery(sql); // 执行数据查询语句(select) R!%nzL@e&`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
0_eqO'"
2)用PreparedStatement来执行sql语句 mwo:+^v(
String sql; !(rAI
sql = "insert into user (id,name) values (?,?)"; QXZyiJX}
PreparedStatement ps = cn.prepareStatement(sql); `XhH{*Q"X
ps.setInt(1,xxx); qx'0(q2Ii(
ps.setString(2,xxx); c7jmzo
... >;^/B R=
ResultSet rs = ps.executeQuery(); // 查询 (Kwqa"Hk4{
int c = ps.executeUpdate(); // 更新 ~g\~x
rNR7}o~ qo
3、处理执行结果 Rh ^(91d
查询语句,返回记录集ResultSet H.m]Dm,z
更新语句,返回数字,表示该更新影响的记录数 !JDr58
ResultSet的方法 ;U|(rM;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $uZmIu9Bi+
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `R$i|,9)
CtXbAcN2B
4、释放连接 V6X )L>!xx
cn.close(); '< U&8?S
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection -B H/)$-$
O|V0WiY<
可滚动、更新的记录集 !,$#i
1、创建可滚动、更新的Statement 7ocUFY0"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]*#i_dho7
该Statement取得的ResultSet就是可滚动的 >!t3~q1Cn
2、创建PreparedStatement时指定参数 _6nAxm&x`%
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u<Kowt<ci
ResultSet.absolute(9000); UPI- j#yc
批量更新 "5&"Ij,/
1、Statement ^o{{kju
Statement sm = cn.createStatement(); /@F'f@;
sm.addBatch(sql1);
x%l(0K
sm.addBatch(sql2); "esuLQC
... J5G<Y*q
sm.executeBatch() '9zW#b
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :$$~$P
2、PreparedStatement nbF<K?
PreparedStatement ps = cn.preparedStatement(sql); }6@E3z]AMO
{ hBjU(}\3
ps.setXXX(1,xxx); 6u0>3-[6OD
... } Bf@69
ps.addBatch(); az F!V
} #4JMb#q0E
ps.executeBatch(); r8s>s6vm
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ]>1Mq,!
+6#$6 hG
事务的处理 )&@YRT\c?8
1、关闭Connection的自动提交 rx2)uUbR
cn.setAutoCommit(false); y:RW:D&
2、执行一系列sql语句 `(FjOd
K
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close gsbr8zwG,
Statement sm ; C2}y#A I
sm = cn.createStatement(insert into user...); 2y
-
QH
sm.executeUpdate(); &VGV0K3Dp
sm.close(); uu.X>agg
sm = cn.createStatement("insert into corp...); '4 *0Pw
sm.executeUpdate(); <= o<lRU
sm.close(); ,c&u\W=p
3、提交 |9jK-F6
cn.commit(); x95s%29RS
4、如果发生异常,那么回滚 t`Kpbfk
cn.rollback();