java 数据库基本操作 ZedFhm
1、java数据库操作基本流程 !e$gp(4
2、几个常用的重要技巧: n,la<N]
可滚动、更新的记录集 So:X!ljN(e
批量更新 <hT\xBb:
事务处理 "4j~2{{F
%H{p&ms
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 4s\spvJ
1、取得数据库连接 @hLkU4S
1)用DriverManager取数据库连接 0.aXg "
例子 }d$-:l,w
String className,url,uid,pwd; EM,C
className = "oracle.jdbc.driver.OracleDriver"; BD g]M/{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Zg;$vIhn
uid = "system"; gN&i&%*!
pwd = "manager"; w~'xZ?
Class.forName(className); 9I/b$$?D
Connection cn = DriverManager.getConnection(url,uid,pwd); \l+v,ELX=
2)用jndi(java的命名和目录服务)方式 N2r zHK
例子 UA[`{rf
String jndi = "jdbc/db"; sFU< PgV
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |rm elQ-
DataSource ds = (DataSource) ctx.lookup(jndi); ]`^! ]Ql
Connection cn = ds.getConnection(); j!;LN)s@?
多用于jsp中 b*|~F
2、执行sql语句 Bous d
1)用Statement来执行sql语句 9+.wj/75
String sql; OATdmHW
Statement sm = cn.createStatement(); .RQra+up
sm.executeQuery(sql); // 执行数据查询语句(select) HDVimoOq
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); N(/) e
2)用PreparedStatement来执行sql语句 Hxu5Dx5![
String sql; gLiJ&H
sql = "insert into user (id,name) values (?,?)"; PK*Wu<<
PreparedStatement ps = cn.prepareStatement(sql); $:ush"=f8^
ps.setInt(1,xxx); 6Z\ aJ
ps.setString(2,xxx); j50vPV8m
... ,GbmL8P7Y
ResultSet rs = ps.executeQuery(); // 查询 O&%'j
int c = ps.executeUpdate(); // 更新 ,0l
Od<
$ {yct
3、处理执行结果 fv+]iK<{
查询语句,返回记录集ResultSet oqrx7+0{
更新语句,返回数字,表示该更新影响的记录数 oOFTQB_6
ResultSet的方法 3i^X9[.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Pz4#>tP
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 'Waazk[@O
c-Gp|.C
4、释放连接 ]4:QqdV
cn.close(); <'Q6\R}:vC
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |k a _Zy
)>a~ %~:
可滚动、更新的记录集 m$0W^u
1、创建可滚动、更新的Statement LIg1U
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .#EU@Hc
该Statement取得的ResultSet就是可滚动的 /A_:`MAZ
2、创建PreparedStatement时指定参数 Koa9W>!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); A U~DbU0O
ResultSet.absolute(9000); CS^6$VL7e
批量更新 aNbS0R>l
1、Statement %9-^,og
Statement sm = cn.createStatement(); Rv1W &s&
sm.addBatch(sql1); MU<(O}
sm.addBatch(sql2); $5nMD=
... Pz)lq2Zm9
sm.executeBatch() !Tzo&G
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 R%r
bysP
2、PreparedStatement B,b8\\^k|
PreparedStatement ps = cn.preparedStatement(sql); 1tuvJ+`{
{ VcjbRpTy&
ps.setXXX(1,xxx); y r (g/0
... Pnytox
ps.addBatch(); s$Vl">9#
} 6w.E Sm
ps.executeBatch(); QM,#:m1o
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \gA!)q.;
--h\tj\U
事务的处理 *'@Oo
1、关闭Connection的自动提交 =Rd`"]Mnfb
cn.setAutoCommit(false); :{u`qi
2、执行一系列sql语句 96WzgHPWo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close WJ{Iv] }9
Statement sm ; 3W1Lh~Av
sm = cn.createStatement(insert into user...); Ai/X*y:[?
sm.executeUpdate(); C% -Tw]T$_
sm.close(); ki1(b]rf
sm = cn.createStatement("insert into corp...); b.*LmSX#
sm.executeUpdate(); Ny^ 1#R
sm.close(); aZ@pfWwa:
3、提交 ?Y"%BS+pt
cn.commit(); Q2
q~m8(
4、如果发生异常,那么回滚
PMjNc_))
cn.rollback();