java 数据库基本操作 e(c\ U}&
1、java数据库操作基本流程 @r"\bBi
2、几个常用的重要技巧: B%F]K<
可滚动、更新的记录集 ",#.?vT`
批量更新 -cgO]q+Oq
事务处理 k/K)nH@)
W}(A8g#6
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 bWe2z~dP
1、取得数据库连接 }Fe~XO`
1)用DriverManager取数据库连接 )GP;KUVae
例子 O
NabL.CV
String className,url,uid,pwd; hRkCB
className = "oracle.jdbc.driver.OracleDriver"; 4]d^L>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; t@%w:*&
uid = "system"; rj4@
pwd = "manager"; 3",gjXmBu
Class.forName(className); TvU
z^
Connection cn = DriverManager.getConnection(url,uid,pwd); aV;|2}q "
2)用jndi(java的命名和目录服务)方式 s:T%,xS
例子 fc#9e9R
String jndi = "jdbc/db"; C,| &
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); YvY|\2^K
DataSource ds = (DataSource) ctx.lookup(jndi); /}:{(Go
Connection cn = ds.getConnection(); PGTEIptX7
多用于jsp中 &PMQ]B
2、执行sql语句 &V38)83a
1)用Statement来执行sql语句 }">r0v!3
String sql; FXCBX:LnvU
Statement sm = cn.createStatement(); HE}0_x.
sm.executeQuery(sql); // 执行数据查询语句(select) J8'"vc} =
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); [4Q;(67
2)用PreparedStatement来执行sql语句 I9?\Jbqg
String sql; (5T>`7g8
sql = "insert into user (id,name) values (?,?)"; bT:u|/I
PreparedStatement ps = cn.prepareStatement(sql); o/AG9|()4
ps.setInt(1,xxx); ing'' _
ps.setString(2,xxx); (4H\ho8+mp
... 3vrVX<_
ResultSet rs = ps.executeQuery(); // 查询 Wa;N(zw0h
int c = ps.executeUpdate(); // 更新 h,LSqjf"
V,r~%p
3、处理执行结果 !Dd'*ee-;
查询语句,返回记录集ResultSet J6 ~Sr
更新语句,返回数字,表示该更新影响的记录数 EX)&|2w
ResultSet的方法 Y9.3`VX
1、next(),将游标往后移动一行,如果成功返回true;否则返回false K^WDA])
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 >.<VD7p
1]xmOx[mb
4、释放连接 }dc0ZRKgx
cn.close(); >}SEU-7&\
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection "L>'X22ed
jg$qp%7i%
可滚动、更新的记录集 ^G4YvS(
1、创建可滚动、更新的Statement m?S;sew@5
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 4Kj.o
该Statement取得的ResultSet就是可滚动的 O-,
"/Z
2、创建PreparedStatement时指定参数 z5@XFaQ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :82T!
ResultSet.absolute(9000); <H-Nft>O
批量更新 .s{"NqRA
1、Statement 3lF"nv
Statement sm = cn.createStatement(); (~~m 8VJ>
sm.addBatch(sql1); )zL@h
sm.addBatch(sql2); ~RR!~q
... }aWy#Oe
sm.executeBatch() @.;+WQE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 F5?S8=i
2、PreparedStatement 1I%u)[;>
PreparedStatement ps = cn.preparedStatement(sql); %lCZ7z2o
{ s^u Y
ps.setXXX(1,xxx); V.Hv6
... ` o)KG,
ps.addBatch(); 7|}4UXr7y
} J[}H^FR
ps.executeBatch(); +Tum K.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ZSf &M
%`]+sg[i
事务的处理 7uR;S:WX
1、关闭Connection的自动提交 ,z&S;f.f
cn.setAutoCommit(false); 9=>q0D2
2、执行一系列sql语句 tpWGmjfo>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^s)`UZ<C=
Statement sm ; sq$v6x sl
sm = cn.createStatement(insert into user...); (?e%w}
sm.executeUpdate(); b
3x|Dq .
sm.close(); ,`t+X=#
sm = cn.createStatement("insert into corp...); 2yA)SGri
sm.executeUpdate(); 2cCiHEL #
sm.close(); kj6:P$tH
3、提交 HA'~1$#z
cn.commit(); YTTyMn
4、如果发生异常,那么回滚 aAjl
58
cn.rollback();