java 数据库基本操作 @<6-uk3S
1、java数据库操作基本流程 qt:->yiq+
2、几个常用的重要技巧: )?xt=9Lh
可滚动、更新的记录集 F"F(s!
批量更新 3)-#yOr
事务处理 CTP%
cq=R
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }>1E,3A:%G
1、取得数据库连接 4dok/ +Ec
1)用DriverManager取数据库连接 Qdn:4yk
例子 -qEr-[z
String className,url,uid,pwd; uB^]5sqfk
className = "oracle.jdbc.driver.OracleDriver"; nx+&
{hn(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; W1!eY,1}
uid = "system"; 6,h<0j{
pwd = "manager"; jF5JpyOc
Class.forName(className); &%bX&;ECzf
Connection cn = DriverManager.getConnection(url,uid,pwd); 'q-h
kN
2)用jndi(java的命名和目录服务)方式 .F6#s
例子 g Q9ff,
String jndi = "jdbc/db"; kL3=7t^ 1
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &
vIKNGJ^
DataSource ds = (DataSource) ctx.lookup(jndi); a,E;R$[!
Connection cn = ds.getConnection(); Sh*P^i.]+
多用于jsp中 ^\6UTnS.
2、执行sql语句 )~n}ieS
1)用Statement来执行sql语句 V&nN/CF
String sql; .=FJ5?:4i%
Statement sm = cn.createStatement(); [5 V
sm.executeQuery(sql); // 执行数据查询语句(select) z7_./ksQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); jl@8pO$
2)用PreparedStatement来执行sql语句 Fi`:G}
String sql; z[rB/|2
sql = "insert into user (id,name) values (?,?)"; o99 a=x6
PreparedStatement ps = cn.prepareStatement(sql); *o#`l H
ps.setInt(1,xxx); 51,m^veO
ps.setString(2,xxx); Ii8jY_
... dkLR
Q
ResultSet rs = ps.executeQuery(); // 查询 *,pqpD>
int c = ps.executeUpdate(); // 更新 h`Mf;'P
p(8\w-6
3、处理执行结果 CP'-CQ\Q
查询语句,返回记录集ResultSet 7.t$#fzi
更新语句,返回数字,表示该更新影响的记录数 wf4Q}l2,d
ResultSet的方法 F)IP~BE-k
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Uoe?5Of(*
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 A^7!+1*K+
b2Hpuej
4、释放连接 d]^i1
cn.close(); AK!G#ug
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection S=2,jPX2r
EGt)tI&
可滚动、更新的记录集 LQjqwsuN{
1、创建可滚动、更新的Statement *+z({S_Nv
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); x'qgpG}?]
该Statement取得的ResultSet就是可滚动的 )'g vaT
2、创建PreparedStatement时指定参数 >xjy
P!bca
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); g;h&Xkp
ResultSet.absolute(9000); 9T1G/0k-
批量更新 6>Cubb>
1、Statement t|m3b~Oyv
Statement sm = cn.createStatement(); $3ILVT
sm.addBatch(sql1); 1:t>}[Y
sm.addBatch(sql2); m+=!Z|K
... /b|sv$BN
sm.executeBatch() xpk|?/6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 {;zPW!G
2、PreparedStatement 4l*&3Ar
PreparedStatement ps = cn.preparedStatement(sql); v+G:,Tc"
{ ;GAYcVB
ps.setXXX(1,xxx); W#[!8d35$
... f/x "yUq
ps.addBatch(); 1 W u
} TG9)x|!
ps.executeBatch(); p1nA7;B-m
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2&m7pcls
1#(1Bs6X
事务的处理 "J#:PfJ%
1、关闭Connection的自动提交 -ZB"Yg$l
cn.setAutoCommit(false); Exr7vL
2、执行一系列sql语句 "->:6Oe2
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close B(falmXJ
Statement sm ; ||V:',#,W
sm = cn.createStatement(insert into user...); -eMRxa>
sm.executeUpdate(); qAS^5|(b[
sm.close(); ?>Aff`dHY
sm = cn.createStatement("insert into corp...); D6u>[Z[T
sm.executeUpdate(); vF&b|V+,
sm.close(); Nz;;X\GI
3、提交 c0 |p34
cn.commit(); U6Ak"
4、如果发生异常,那么回滚 ThxrhQ
q[+
cn.rollback();