java 数据库基本操作 d@b2XCh<K
1、java数据库操作基本流程 V pY,@qh
2、几个常用的重要技巧: B
T
{cTj0W
可滚动、更新的记录集 xbHI4A"Z
批量更新 X%B$*y5
事务处理 Imclz4'8
&h7
n>q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ];=|))ky"
1、取得数据库连接 ;WrG\R/|
1)用DriverManager取数据库连接 g
4$
例子 >f1fvv6
String className,url,uid,pwd; y~M6
className = "oracle.jdbc.driver.OracleDriver"; +Ll29Buyi
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "Wb KhE
uid = "system"; 'L{pS-+6
pwd = "manager"; Ri::Ek3qu
Class.forName(className); wM-H5\9n
Connection cn = DriverManager.getConnection(url,uid,pwd); ?zVE7;r4U
2)用jndi(java的命名和目录服务)方式 D)S_ p&
例子 ;/IXw>O(/
String jndi = "jdbc/db"; _t4(H))]vG
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uI9+@oV
DataSource ds = (DataSource) ctx.lookup(jndi); hew"p( `
Connection cn = ds.getConnection(); adgd7JjI*
多用于jsp中 s%5XBI
2、执行sql语句 ,u-9e4
1)用Statement来执行sql语句 ]'hel#L;l
String sql; mGmZ}H'{
Statement sm = cn.createStatement(); "W9z>ezp
sm.executeQuery(sql); // 执行数据查询语句(select) ^![7X'!;pt
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~~t>;
2)用PreparedStatement来执行sql语句 ]xJ.OUJy
String sql; /,$V/q+
sql = "insert into user (id,name) values (?,?)"; %* gg6Q
PreparedStatement ps = cn.prepareStatement(sql); |'x"+x
ps.setInt(1,xxx); muFWFq&yP
ps.setString(2,xxx); iHQ$L# 7
... pDhUD}1G
ResultSet rs = ps.executeQuery(); // 查询 l!\~T"-7;:
int c = ps.executeUpdate(); // 更新 iVmy|ewd
;.R)
uCd{=
3、处理执行结果 Aq>?G+
查询语句,返回记录集ResultSet E4_,EeC#
更新语句,返回数字,表示该更新影响的记录数 6 lEv<)cC
ResultSet的方法 s8';4z
1、next(),将游标往后移动一行,如果成功返回true;否则返回false :vaVghN\
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 #2Iw%H 2q&
Bcb
'4*:
4、释放连接 t23W=U
cn.close();
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection )N\ BC
dAM]ZR<
可滚动、更新的记录集 qHd7C3
1、创建可滚动、更新的Statement zq3f@xOK
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); p&HO~J<w
该Statement取得的ResultSet就是可滚动的 :j/sTO=
2、创建PreparedStatement时指定参数 t"MrrK>T
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [O]rf+NZ(5
ResultSet.absolute(9000); {*
w _*
批量更新 lB#7j
1、Statement ^E+fmY2a
Statement sm = cn.createStatement(); O+=}x]q*y
sm.addBatch(sql1); S&J5QZjC
sm.addBatch(sql2); i]qxF&1
... ]4K4Nh~
sm.executeBatch() VG50n<m9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 L{&Yh|}
2、PreparedStatement h$%h w+"4
PreparedStatement ps = cn.preparedStatement(sql); d(KK7SQg
{ KYz@H#M
ps.setXXX(1,xxx); G%K&f1q%
... J
L1]auO*
ps.addBatch(); wk1/&
} 0eK>QZ_
ps.executeBatch(); la^K|!|
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 z 8#{=e
nmyDGuzk
事务的处理 7m:TY>{
1、关闭Connection的自动提交 vRDs~'f
cn.setAutoCommit(false); J(P'!#z^
2、执行一系列sql语句 E, oR.B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -q&,7'V
Statement sm ; ;sx4w!Y,
sm = cn.createStatement(insert into user...); 4Bt)t#0
sm.executeUpdate(); >q ,Z*s>?
sm.close(); 3|EAOoWnK
sm = cn.createStatement("insert into corp...); 4C*0MV
sm.executeUpdate(); `-?`H>+OG
sm.close(); '#Do( U'
3、提交 3bQq
Nk
cn.commit(); JLg/fB3%
4、如果发生异常,那么回滚 F4ylD5Y!
cn.rollback();