java 数据库基本操作 Yjpb+}
1、java数据库操作基本流程 ::kpl2r\c
2、几个常用的重要技巧: B'NS&7+].
可滚动、更新的记录集 9)1P+c--
批量更新 B b$S^F(Xq
事务处理 Y}85J:q]
W^-hMT]uD
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 hQ\#Fhu7
1、取得数据库连接 ]v/t8`
1)用DriverManager取数据库连接 39'X$!
例子 7)g;Wd+H
String className,url,uid,pwd; "4J?JR
className = "oracle.jdbc.driver.OracleDriver"; wOD/Z8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; X%RQB$
uid = "system"; -i| /JH
pwd = "manager"; g-4gI\
Class.forName(className); 4;B=Qoxe
Connection cn = DriverManager.getConnection(url,uid,pwd); O@G<B8U,K
2)用jndi(java的命名和目录服务)方式 1uKD&k%q
例子 =?y^O0v
String jndi = "jdbc/db"; NdaVT5RB
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); H&"_}
DataSource ds = (DataSource) ctx.lookup(jndi); 2
rbX8Y
Connection cn = ds.getConnection(); [YL sEo=
多用于jsp中 WBIQ%XB'
2、执行sql语句 (, ;MC/l
1)用Statement来执行sql语句 ][s*~VK;
String sql; >b[4
Statement sm = cn.createStatement(); !pE>O-| K
sm.executeQuery(sql); // 执行数据查询语句(select) q8&4=eV\A
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); RlG'|xaT
2)用PreparedStatement来执行sql语句 |:`?A3^m#
String sql; a,en8+r]
sql = "insert into user (id,name) values (?,?)"; Yj|c+&Ng
PreparedStatement ps = cn.prepareStatement(sql); &lO Xi?&"
ps.setInt(1,xxx); D3,t6\m
ps.setString(2,xxx); w*]_FqE
... @]}Qh;a~
ResultSet rs = ps.executeQuery(); // 查询 Udb0&Y1^
int c = ps.executeUpdate(); // 更新 7lnM|nD
gDUoc*+h
3、处理执行结果 s (l+{b &
查询语句,返回记录集ResultSet tSw~_s_V
更新语句,返回数字,表示该更新影响的记录数 B8P@D"u
ResultSet的方法 Dg ?Ho2ih
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ?j},O=JFn
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 {EiG23!qV
(7
]\p
4、释放连接 {Tjtj@-
cn.close(); K6PC&+x
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ^MF=,U'8
bCe[nmE2
可滚动、更新的记录集 oW\Q>c7
=
1、创建可滚动、更新的Statement rzc 3k~@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #,Fx@3y\a
该Statement取得的ResultSet就是可滚动的 _.s\qQ
2、创建PreparedStatement时指定参数 l,~ N~?
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); # UP,;W
ResultSet.absolute(9000); 5VY%o8xXa
批量更新 -NI@xJO4(;
1、Statement Y6[] wUJ
Statement sm = cn.createStatement(); DU*Hnii
sm.addBatch(sql1); m-&a~l
sm.addBatch(sql2); (RI>aDGRH
... 'PxL^
sm.executeBatch() }K qw\]`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 A=@V LU4%
2、PreparedStatement }VJ hw*s
PreparedStatement ps = cn.preparedStatement(sql); Ezo" f
{ kG~ivB}x
ps.setXXX(1,xxx); "X!_37kQ
... J}93u(T5
ps.addBatch(); ~h~r]tV*+
} &El[
ps.executeBatch(); g
tSHy*3]
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g]TI8&tP!L
123-i,epg
事务的处理 PdE)m/
1、关闭Connection的自动提交 -qr:c9\px
cn.setAutoCommit(false); 'p{Y{
$Q
2、执行一系列sql语句 oGU.U9~!
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o 2$<>1^
Statement sm ; d<^6hF
sm = cn.createStatement(insert into user...); 8?]%Qi
sm.executeUpdate(); =-#iXP@
sm.close(); _s=Pk[e
sm = cn.createStatement("insert into corp...); ZS
7)(j$.
sm.executeUpdate(); x Ps&CyI
sm.close(); ! a8h
3、提交 Av[|.~g
cn.commit(); &nY2u-Q
4、如果发生异常,那么回滚 !'UsC6Y4
cn.rollback();