java 数据库基本操作 q"|,HpQ
1、java数据库操作基本流程 iBq|]
2、几个常用的重要技巧: ],lrT0_cT
可滚动、更新的记录集 t(O{IUYM
批量更新 {R2gz]v4
事务处理 6/m|Sg.m
(~R [K,G
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 MT8BP)C
1、取得数据库连接 x:h0/f
1)用DriverManager取数据库连接 [Ch)6p
例子 [7Yfv
Xp
String className,url,uid,pwd; ;^9A o>(?y
className = "oracle.jdbc.driver.OracleDriver";
p97}HT}
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; t8Sblgq
uid = "system"; {Lex((
pwd = "manager"; om`x"x&6
Class.forName(className); w"Q6'/P
Connection cn = DriverManager.getConnection(url,uid,pwd); JMMT886
2)用jndi(java的命名和目录服务)方式 U4J9bp|
例子 c~@Z
String jndi = "jdbc/db"; -'j_JJ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~w&P]L\dB
DataSource ds = (DataSource) ctx.lookup(jndi); 7IrbwAGZ3
Connection cn = ds.getConnection(); }=1#ANM1
多用于jsp中 a@ E+/9
2、执行sql语句 qno8qF*
1)用Statement来执行sql语句 #}/YnVk
String sql; ?R7>xrp5
Statement sm = cn.createStatement(); vtvF)jlX
sm.executeQuery(sql); // 执行数据查询语句(select) "ooq1
0P
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); r[
UZHX5+S
2)用PreparedStatement来执行sql语句 .Ulrv5wJ
String sql; As&=Pb9
sql = "insert into user (id,name) values (?,?)"; )T-C/ 3
PreparedStatement ps = cn.prepareStatement(sql); He#5d!cf:M
ps.setInt(1,xxx); 5J d7<AO_
ps.setString(2,xxx); EJM6TI"
... `D0>L'
ResultSet rs = ps.executeQuery(); // 查询 jE
/pba4R
int c = ps.executeUpdate(); // 更新 "f/Su(6{0
'[E|3K5d
3、处理执行结果 (]JZ1s|
查询语句,返回记录集ResultSet sD|P*ir
更新语句,返回数字,表示该更新影响的记录数 P8hA<{UFS\
ResultSet的方法 \`H"4r[?(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false )20jZm*
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 uSeRn@
K.y2 $b/
4、释放连接 AY{-Hf&
cn.close(); 9~bl
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection PGaB U3
K%Dksx7ow
可滚动、更新的记录集 i+x$Y)=
1、创建可滚动、更新的Statement F/MzrK\':m
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [^rT: %Z
该Statement取得的ResultSet就是可滚动的 X@;o<2^
2、创建PreparedStatement时指定参数 v8
Q/DJ~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); > 3<P^-9L
ResultSet.absolute(9000); ,/d
R
批量更新 CdxEY
1、Statement W'3&\}
Statement sm = cn.createStatement(); [I4:R_\
sm.addBatch(sql1); [(Z sQK
sm.addBatch(sql2); aR3R,6ec
... f}jo18z%
sm.executeBatch() {s=n "*Qp)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 s:_M+_7_
2、PreparedStatement 2~:jg1
PreparedStatement ps = cn.preparedStatement(sql); E5-f{Qc
{ v9<7= D&x
ps.setXXX(1,xxx); 8db J'
... f L @rv
ps.addBatch(); K+9oV[DMs
} .AEOf0t
ps.executeBatch(); ZG=B'4W
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 X67.%>#3
]}4{|& e
事务的处理 _R&}CP
1、关闭Connection的自动提交 !ke_?+8sY
cn.setAutoCommit(false); wzLR]<6G
2、执行一系列sql语句 v35wlt^}
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -&4W0JK9
Statement sm ;
%9D$N
sm = cn.createStatement(insert into user...); eBZa9X$
sm.executeUpdate(); cY%[UK $l
sm.close(); XkB^.[B
sm = cn.createStatement("insert into corp...); 'dE G\?v9
sm.executeUpdate(); ?\_N*NEtK
sm.close(); 'ZyHp=RN)
3、提交 1b4aY>
Z
cn.commit(); RYU(z;+0p
4、如果发生异常,那么回滚 n5nV461U
cn.rollback();