java 数据库基本操作 Y3O#Q)-j$
1、java数据库操作基本流程 qoAj]
")
2、几个常用的重要技巧: U T="2*3gz
可滚动、更新的记录集 eilYA_FL.
批量更新 n[(Qr9
事务处理 $v Z$'(
m>SErxU(z
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 IIyI=WlpG
1、取得数据库连接 &?h,7
D;A
1)用DriverManager取数据库连接 b:w?PC~O
例子 Ag@;
String className,url,uid,pwd; ;`6^6p\p
className = "oracle.jdbc.driver.OracleDriver"; |2KAo!PI
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; cp o-.
uid = "system"; U)3DQ6T99
pwd = "manager"; fNrgdfo
Class.forName(className); NssELMtF!g
Connection cn = DriverManager.getConnection(url,uid,pwd); -ig6w.%lk
2)用jndi(java的命名和目录服务)方式 $HJwb-I
例子 R"K#7{p9
String jndi = "jdbc/db"; GaSPJt
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); c*@G_rb
DataSource ds = (DataSource) ctx.lookup(jndi); QD%L0;j
Connection cn = ds.getConnection(); gynh#&r
多用于jsp中 !A%<#Gjt
2、执行sql语句 +a*tO@HG
1)用Statement来执行sql语句 XU"~h64]
String sql; {P*m;a`}
Statement sm = cn.createStatement(); ."FuwKSJCo
sm.executeQuery(sql); // 执行数据查询语句(select) o*J3C>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); yiO.z
2)用PreparedStatement来执行sql语句 ~s5SZK*
String sql; k-}b{
sql = "insert into user (id,name) values (?,?)"; F;]%V%F.X
PreparedStatement ps = cn.prepareStatement(sql); x7$}8LZ"B
ps.setInt(1,xxx); ,N0#!<}4
ps.setString(2,xxx); 8]LD]h)B"
... y99mC$"Ee`
ResultSet rs = ps.executeQuery(); // 查询 Jkek-m
int c = ps.executeUpdate(); // 更新 7a~X:#
Sy
'Dp9!|
3、处理执行结果 f`Fi#EKT
查询语句,返回记录集ResultSet Bi{$@n&?f
更新语句,返回数字,表示该更新影响的记录数 cCxBzkH6
ResultSet的方法 Q 7?#=N?
1、next(),将游标往后移动一行,如果成功返回true;否则返回false /Sh#_\x
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ^(FdXGs[
0vw4?>Jf@
4、释放连接 lg&t8FHa;
cn.close(); OE- gC2&Bm
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &Udb9
GI1
可滚动、更新的记录集 z5YWt*nm
1、创建可滚动、更新的Statement pJtex^{!:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); U-3i
该Statement取得的ResultSet就是可滚动的 .Fp4:
e
2、创建PreparedStatement时指定参数 Ll4g[8
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 1 |jt"Hz
ResultSet.absolute(9000); _/tHD]um
批量更新 c.e2 M/
1、Statement @
rc{SB
Statement sm = cn.createStatement(); y9Us n8
sm.addBatch(sql1); ?)ONf#4Y
sm.addBatch(sql2); @nCd
... bXNk%W[n
sm.executeBatch() K>@+m
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 W}mn}gTQ
2、PreparedStatement 736Jq^T
PreparedStatement ps = cn.preparedStatement(sql); ZG&>:Si;
{ V6,H}k
ps.setXXX(1,xxx); gK'1ZLdZ2
... %Da1(bBh
ps.addBatch(); ^0\
} @pRlxkvV
ps.executeBatch();
z\%67C
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 dx@-/^.
%#xaA'?
[
事务的处理 CmoE_8U>
1、关闭Connection的自动提交 =h5H~G5AT
cn.setAutoCommit(false); YOmM=X+'H
2、执行一系列sql语句 I!Z_[M
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -^hWM}F
Statement sm ; vkEiOFU!u
sm = cn.createStatement(insert into user...); ud'-;W
sm.executeUpdate(); %UERc{~o*,
sm.close(); M:[ %[+6
sm = cn.createStatement("insert into corp...); /n{omx
sm.executeUpdate(); jYmR
sm.close(); FW G6uKv
3、提交 '9
[vDG~
cn.commit(); +b3RkkC
4、如果发生异常,那么回滚 ic#`N0s?
cn.rollback();