这个题目完全可以按一本书来写,一篇文章远远不能描述清楚Oracle面向对象技术,不过就笔者所知,很少Oracle项目会
大规模使用其面向对象技术做开发,笔者在这里谈Oracle面向对象,翼此能够起到抛砖引玉的作用,让大家有想法进一步去探索
数据库面向对象编程。当然,笔者在这里和大家探讨的内容主要来自项目中的积累,而非笔者兴起之作,大家可以放心的在项目中
使用。
我们可以把应用按技术简单的分两层:数据库层和应用层,数据层一般来说是面向关系模型,应用层是面向对象模型,很多时候我们需要写
代码把关系数据转化为实体对象,这是一个繁重又需要开发者细心的一个工作。为了把开发者从中解脱出来,诞生了很多技术,O/R
Mapping的有Hibernate,一些JDO产品,EJB CMP等,对象数据库的有DB4O、MyOODB等。但是,到目前为止,这些技术并不能帮我们解决开发中的
主要矛盾。O/R Mapping工具只能映射简单的关系模型,处理普通的DML(Insert,Update,Delete),在批处理和过程处理上就捉襟见肘了,
大数据量处理的时候又存在效率低下、内存消耗巨大等诸多问题。对象数据库是九十年代兴起的技术,目前在嵌入式开发以及一些小应用中有一定的市场,
当然还不能用于大型企业应用,主要的原因是功能太简单了,大数据量存储和处理性能都无法得到保证,开发者的需求不能充分地得到满足。
大型应用还是要借助传统的关系数据库,这样性能和可靠性都能够得到保证。关系数据库也在不断地发展,许多数据库也引入了面向对象的
思想,这其中以Oracle为代表,Oracle9i就号称面向对象数据库,当然,这有打广告的嫌疑,不过如果使用好了Oracle的面向对象技术,
还是可以大大简化我们的许多开发工作。
下面我们切入主题,自Oracle9i以来,Oracle就不再是单纯的关系数据库管理系统,它在关系数据库模型的基础上,添加了一系列面向对象的特性。
Oracle的对象体系遵从面向对象思想的基本特征,许多概念同C++,JAVA中的类似,具有继承,重载,多态等特征,但又有自己的特点。Oracle
面向对象的最基本元素是它的对象类型,也就是Type,在Oracle8i中,Type只用作数据类型,而且成员只能是基本数据类型,这里顺便提一下,创建者之外
的其他用户需要得到授权才能使用对象类型。前面也提到,Oracle面向对象的内容很多,以Type为基础的对象存储,对象查询内容很丰富,限于篇幅,
本文就不探讨这些内容,重心放在面向对象编程的几大特性(继承、重载、多态)上。
我们先写一个简单的Type:
CREATE OR REPLACE TYPE SIMPLE AS OBJECT
(
id VARCHAR2(10),
name VARCHAR2(30)
)
现在有了这个对象,如何使用呢?
declare
l_o_1 SIMPLE;
l_o_2 SIMPLE;
begin
l_o_1 := SIMPLE('1','Jean');
DBMS_OUTPUT.PUT_LINE(l_o_1.name);
l_o_2 := SIMPLE(id => '2',name => 'Henry');
DBMS_OUTPUT.PUT_LINE(l_o_2.name);
l_o_2 := SIMPLE(3,NULL);
DBMS_OUTPUT.PUT_LINE(l_o_2.name);
end;
有了上面的测试代码,读者应该很容易找到其与面向对象语言(比如Java)的差异,没有了new,也没有了默认无参数构造器,默认使用定义的属性作为
构造器参数,不过足以描述各种实体。另外要说明的是,Type的属性没有private,protected,public的说法,所有的属性调用者都可以访问,即都是public。
刚才那个那个例子只有属性,没有行为,即没有方法,我们举第二个例子:
CREATE OR REPLACE TYPE AO AS OBJECT
(
id VARCHAR2(10),
name VARCHAR2(30),
CONSTRUCTOR FUNCTION AO
(
SELF IN OUT NOCOPY AO ,
m_id IN VARCHAR2
) RETURN SELF AS RESULT,
STATIC PROCEDURE MAIN,
MEMBER PROCEDURE test) NOT FINAL
/
CREATE OR REPLACE TYPE BODY AO AS
CONSTRUCTOR FUNCTION AO
(
SELF IN OUT NOCOPY AO ,
m_id IN VARCHAR2
) RETURN SELF AS RESULT IS
BEGIN
SELF.id := m_id;
RETURN;
END;
STATIC PROCEDURE MAIN IS
l_ao AO;
BEGIN
DBMS_OUTPUT.PUT_LINE('AO:MAIN');
l_ao := AO(id => '1',name => 'Jean');
l_ao.test;
l_ao := AO(m_id => '2');
l_ao.test;
l_ao := AO('3');
l_ao.test;
l_ao := AO('4','Henry');
l_ao.test;
END MAIN;
MEMBER PROCEDURE test IS
BEGIN
DBMS_OUTPUT.PUT_LINE('AO:test action,id is '|| SELF.id);
END test;
END;
/
测试代码:
declare
begin
AO.MAIN;
end;
从这个例子,相信我们可以看到很多东西,对象可以有对象方法,静态方法,我们可以用静态方法做测试,对象可以自定义构造器,但是不能覆盖默认的属性构造器。
定义类型的时候可以指定NOT FINAL(可被继承)以及NOT INSTANTIABLE(可实例化)。到了这里,相信大家对Oracle面向对象的东西应该有了一个初步的了解,下一步
我们需要关注的是继承。
下面的BO继承了AO,并有了自己的行为,
CREATE OR REPLACE TYPE BO UNDER AO
(address VARCHAR2(30),
OVERRIDING MEMBER PROCEDURE test,
MEMBER PROCEDURE test(str VARCHAR2),
MEMBER PROCEDURE write
)
/
CREATE OR REPLACE TYPE BODY BO AS
OVERRIDING MEMBER PROCEDURE test IS
BEGIN
DBMS_OUTPUT.PUT_LINE('BO:test action,id is '|| SELF.id);
END test;
MEMBER PROCEDURE test(str VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('BO:test action,id is '|| SELF.id || ',parameter is ' || str);
END test;
MEMBER PROCEDURE write IS
BEGIN
DBMS_OUTPUT.PUT_LINE('BO:write action');
END write;
END;
/
测试代码:
declare
l_bo BO;
begin
l_bo := BO('1','Jean','china');
DBMS_OUTPUT.PUT_LINE(l_bo.name);
l_bo := BO(ID => '2',name => 'Henry',address => 'US');
DBMS_OUTPUT.PUT_LINE(l_bo.name);
l_bo.test;
l_bo.test('123');
l_bo.write;
end;
请注意,如果是覆盖父类方法,必须写OVERRIDING关键字,否则机会编译出错。子类如果添加了属性,那默认的构造器参数就会发生变化。
不过,正因为Type的面向对象特性,也给开发者带了一些不便利的地方,比如要调试Type的某个方法,就必须构造对象;另外,由于有了继承关系,
如果一个Type存在子Type,那么不能随便replace以及drop,但是我们又需要添加新的方法或者属性,那怎么办?解决的办法是强制drop,然后再创建,
例如:drop type AO force;不过创建以后,又需要重新编译所有无效对象。
说到这里,我相信大家对基于Type的编程有了一个全面的了解,面向对象的好处我想我就不用多说了,对于我们程序员来说,最大的益处就在于我们
可以利用继承关系很好地封装我们的代码。
要使用Oracle面向对象的特性,除了在PL/SQL中调用以外,我们还可以在外部语言中去调用,我们就以Java为例来说明,Java访问DB我们知道是通过
JDBC调用,有两种方式可以采用:
1,使用Oracle提供的Jpublisher将ORACLE中的一个对象类型映射成为一个JDBC的类,这里就不具体说明了,读者可以到Oracle网站上去看。
2,直接调用PL/SQL包装,在这里写个简单的例子
import java.sql.*;
public class TestType {
public static void main(String[] args)
throws Exception
{
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.3.1:1521:sic","user","password");
StringBuffer sb = new StringBuffer("{Call \n");
sb.append("DECLARE \n");
sb.append("l_bo BO; \n");
sb.append("BEGIN \n");
sb.append("l_bo := BO('1','Jean','china');\n");
sb.append("l_bo.write; \n");
sb.append("END} ");
String sql = sb.toString();
CallableStatement cs = conn.prepareCall(sql);
cs.execute();
System.out.println("test finished");
}
}
有些读者可能本文感觉有点虎头蛇尾,没办法,最近笔者太忙了,有时间再完善。欢迎提意见发送至lxjchengcu@gmail.com
分享到:
- 2007-05-31 13:53
- 浏览 4666
- 评论(0)
- 论坛回复 / 浏览 (0 / 3328)
- 查看更多
相关推荐
11. **面向对象编程**:了解Oracle中的对象类型、对象表、继承和多态性,以及如何在PL/SQL中实现面向对象编程。 12. **并发控制**:学习如何处理多用户环境下的并发问题,如锁定和死锁。 13. **PL/SQL与Java、.NET...
Java是由Sun Microsystems(后被Oracle收购)在1995年推出的,其设计目标是创建一种简单、面向对象、健壮且可移植的语言,能够用于分布式计算环境。与C++相比,Java具有许多独特的特性,这些特性使其在现代软件开发...
- 熟悉C++面向对象编程,理解类的设计模式和继承机制,以便更好地利用COdb类。 - 能够调试和优化C++代码,解决可能出现的内存管理和并发问题。 7. **进一步研究**: - 分析COdb类的源码,理解其内部实现细节,...
Java认证课程旨在帮助学员深入理解和掌握Java编程语言的核心概念与技术,特别关注Java应用程序(Java Applications)和Java小应用程序(Java Applets)的面向对象编程方法。本课程将引导学习者从基础到高级,逐步...
5. 面向对象的特性:Oracle支持创建对象类型、继承、封装和多态,使SQL更接近面向对象编程。 四、性能优化 1. 索引:加快数据检索速度,但创建和维护需要消耗空间和资源。 2. Explain Plan:分析SQL执行计划,找出...
另外,Oracle 10g的PL/SQL还引入了一些高级特性,如包(PACKAGE)、触发器(TRIGGER)和面向对象编程(Object-Relational Features)。包可以将相关的类型、变量、过程和函数封装在一起,提供更好的代码组织和复用。...
对于开发人员,书中会深入探讨PL/SQL,这是一种在Oracle环境中使用的面向过程的编程语言,用于编写存储过程、函数、触发器等。通过学习PL/SQL,开发者可以更好地与数据库交互,实现更复杂的数据处理逻辑。 另外,...
- 面向对象特性。 - 错误处理机制。 - 结构化的编程支持。 - 可以直接调用SQL语句。 **1.2 PL/SQL环境搭建** - **安装Oracle数据库**:确保系统中已经安装了Oracle数据库服务器。 - **PL/SQL Developer工具**:...
课程内容涵盖了面向对象程序设计、软件测试、运维基础、成本核算方法等多个方面。在大数据应用开发(Java)职业技能“1+X”证书的要求下,中级证书的考取者需要掌握Java编程基础知识和面向对象开发技术中的类和对象...
C#支持面向对象编程,具有丰富的类库和现代化的语法特性,如异步编程、LINQ查询等,使得开发者能够快速高效地构建复杂系统。 Oracle数据库是企业级关系型数据库管理系统,广泛用于存储大量结构化数据。在题库系统中...
9. **JPA和Hibernate**:对于更高级别的数据访问,可以使用Java Persistence API(JPA)和Hibernate ORM框架,它们提供了面向对象的映射和自动化事务处理,简化了数据库操作。 10. **Oracle高级特性**:例如物质化...
- **PL/SQL**:Oracle的面向过程的编程语言,用于编写存储过程、函数、触发器等,增强数据库的逻辑处理能力。 - **数据库架构**:理解表空间、段、区、块的概念,以及如何通过它们来管理和优化存储。 - **数据库...
2. **类与对象**:Java的核心是面向对象编程,这涉及到类的定义、对象的创建以及封装、继承和多态三大特性。在课件中,唐大仕教授会详细解释如何定义类,如何通过构造函数初始化对象,以及如何实现类的继承和接口。 ...
接下来,教程会深入到面向对象编程的概念,这是Java的核心特性。类是对象的蓝图,定义了对象的属性和行为。对象是类的实例,具备类定义的特性和功能。封装、继承和多态是面向对象的三大特性,封装确保数据安全,继承...
Oracle客户端PL/SQL Developer是用于管理和开发Oracle数据库的应用程序,主要面向数据库管理员(DBA)和开发人员。PL/SQL Developer是由Allround Automations公司开发的一款集成开发环境(IDE),它专注于Oracle...
Java是一种广泛使用的编程语言,由Sun Microsystems公司(现属于Oracle公司)在1995年首次发布。它是一种面向对象的语言,意味着它将现实世界中的事物抽象为对象,这些对象具有属性(数据)和方法(行为)。Java语言...
7. PL/SQL编程:Oracle的PL/SQL是一种面向过程的编程语言,用于扩展SQL的功能。掌握变量声明、流程控制语句、异常处理等PL/SQL概念,能帮助解决更复杂的数据库问题。 8. 数据库备份与恢复:理解Oracle的备份策略,...
通过学习和实践Delphi 7的程序设计,开发者不仅可以掌握Pascal语言和面向对象编程,还能了解到Windows应用程序开发的方方面面。本教程中的例子将涵盖上述各个知识点,为读者提供实际操作的经验和指导。在探索过程中...
它不仅具备传统的关系数据库特性,还融入了面向对象的特性。Oracle数据库广泛应用于各种规模的企业和组织中,包括但不限于银行业、电信业、移动通信业、航空业、保险业、金融业、电子商务领域和跨国公司等。Oracle...