java 数据库基本操作 )dJaF#6j
1、java数据库操作基本流程 31y=Ar""
2、几个常用的重要技巧: EW{z?/
可滚动、更新的记录集 92GO.xAD?
批量更新 p
IXBJk
事务处理 5yO6szg
j3rBEQ,R
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 o)7gKWjujP
1、取得数据库连接 -tSWYp{
1)用DriverManager取数据库连接 tH<v1LEZN
例子 ZgLO[Bj
String className,url,uid,pwd; E{d Mdz
className = "oracle.jdbc.driver.OracleDriver"; oQ 5g0(J~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; s&p*.I]@>
uid = "system"; 0}c*u) ,
pwd = "manager"; l/_3H\iM
Class.forName(className); Xz0jjO,
Connection cn = DriverManager.getConnection(url,uid,pwd); 0CxQ@~ttl
2)用jndi(java的命名和目录服务)方式 A?3hNvfx
例子 d^IOB|6Q
String jndi = "jdbc/db"; :Q sGwhB
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); gO?+:}!
DataSource ds = (DataSource) ctx.lookup(jndi); hq/\'Z&!+P
Connection cn = ds.getConnection(); pK#Ze/!
多用于jsp中 d+%1q
2、执行sql语句 hNXPm~OK\
1)用Statement来执行sql语句 YZf<S:
String sql; REhXW_x
Statement sm = cn.createStatement(); =V1k'XJ
sm.executeQuery(sql); // 执行数据查询语句(select) phUno2fH
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 0,(U_+n
2)用PreparedStatement来执行sql语句 Va06(Cq
String sql; y>u+.z a|
sql = "insert into user (id,name) values (?,?)"; [zK|OMxoV
PreparedStatement ps = cn.prepareStatement(sql); *L/_ v
ps.setInt(1,xxx); N<:5 r
ps.setString(2,xxx); L._I"g5 H9
... 4-=> >#
P
ResultSet rs = ps.executeQuery(); // 查询 =A<kDxqH
int c = ps.executeUpdate(); // 更新 X4&{/;$
qJFBdJU (1
3、处理执行结果 Fm{Ri=X<:
查询语句,返回记录集ResultSet Fg?Gx(g4
更新语句,返回数字,表示该更新影响的记录数 T.!GEUQ
ResultSet的方法 ?{$Q'c_I
1、next(),将游标往后移动一行,如果成功返回true;否则返回false EKk~~PhW 8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 B @UaaWh
X^?<, Y)1.
4、释放连接 8^$}!9B~JZ
cn.close(); ' G-]>
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection `Qv7aY
lKI1bs]i
可滚动、更新的记录集 (}"r 5
1、创建可滚动、更新的Statement U#+S9jWe
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +XJj:%yt
该Statement取得的ResultSet就是可滚动的 ._-^58[
2、创建PreparedStatement时指定参数 J+[&:]=P
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); LCRreIIgZ
ResultSet.absolute(9000); #,q w~l]
批量更新 6/T
hbD-C
1、Statement X7{ueP#L
Statement sm = cn.createStatement(); >yg mE`g
sm.addBatch(sql1); a
=*(>=
sm.addBatch(sql2); 1s=M3m&H
... 4s^5t6
sm.executeBatch() z;GnQfYG
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &'N{v@Oi)
2、PreparedStatement ly}6zOC\
PreparedStatement ps = cn.preparedStatement(sql); Q{UR3U'Q
{ 26yv w
ps.setXXX(1,xxx); qWGnIPk
... V?
w;YTg
ps.addBatch(); c\-5vw||b
} Cv>|>Ob#
ps.executeBatch();
3p"VmO
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \^iJv~d
rF2`4j&!
事务的处理 PSI5$Vna4p
1、关闭Connection的自动提交 =;7gxV3;
cn.setAutoCommit(false); "8&pT^
2、执行一系列sql语句 7!#x-KR~5
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 0_}OKn)J
Statement sm ; (\, <RC\
sm = cn.createStatement(insert into user...); ?5Wj y
sm.executeUpdate(); @R_a'v-
sm.close(); 4v33{sp
sm = cn.createStatement("insert into corp...); 1% ]|O
sm.executeUpdate(); 1LZ?!Lw
sm.close(); Lz2wOB1Zc+
3、提交 '+?AaR&p?
cn.commit(); ?!U=S=8
4、如果发生异常,那么回滚 e ,/I}W
cn.rollback();