`
zhongxiucheng
  • 浏览: 71313 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring DAO体系结构

 
阅读更多

springDAO体系结构

在spring的众多应用中,对数据库的操作是一个很重要的部分,spring对DAO结构的抽象是一个非常值得研究的问题。这里并不打算讨论spring在数据库操作中的底层技术,例如数据库异常转换系统、事务抽象等,这里我只想讨论一下在数据库操作中与程序员接口的部分,即DAO接口的抽象。在spring中的对DAO接口的抽象主要分为两个部分,第一个部分是spring自己对jdbc的直接抽象;第二个部分是spring对第三方ORM框架的集成。Spring在对jdbc进行抽象的时候运用了一些很好的思想,例如回调、映射、模板方法等,当然在对其它ORM框架进行集成的时候也运用了这些思想,实际上可以把spring对jdbc接口的直接抽象看成是一个小型的DAO框架,可以与其它ORM框架放在同样重要的位置进行研究,不论是spring自已对jdbc进行抽象,还是对第三方的ORM框架进行集成,基本都遵循一种雷同的模式。

在spring的DAO体系中主要有以下几种类型的组件:最上层为DaoSupport类型,它可以看成是Template类型类的工厂类,它负责Template类型类的实例创建,少量周边资源的管理,例如连接、DataSource、Session等,并规范实例的创建流程。这种类型的类在实际开发中通常都是程序员需要直接继承的类;其次为Template类型的类,这种类型的类是spring抽取数据库实际操作的核心类型,它是对Operations类型的接口的实现,具体的关系可以参考下面图(1)在前两组中并没有画出DoaSupport类,第三组Hibernate的集成图最完整。

从下面三组高度抽象的结构图可以可看出:Operations、Accessor与Template三者是紧密相连的。Accessor类型的类主要用来规范Template的创建,它的原意应该是“访问器”之类意思,在这里它主要为Template提供必要的基础设施,除了一些便利的工具方法,最重要的功能应该是创建并管理访问数据库的对象,根据框架的不同这些对象也是不同的,可能是底层的DataSource,也可能是高层的SessionFactory,Template并不负责这些基础设施的管理,它主要负责Operations接口的实现,Operations接口是程序员最频繁使用的接口,可以说Operations接口就是对数据库增、删、查、改操作的抽象,但这里有一个非常遗憾的事情,Operations接口并不是一个规范的接口,它是与环境相关,与框架相关。

图(1)

通过对各种Operations接口的分析,可以找出各个框架的关键点与框架的自身特点,这里主要以JdbcOperations、SqlMapClientOperations(iBatis2)、HibernateOperations为例进行分析。在进行分析之前有必要对jdbc的API有所了解,因为所有框架都是建立在jdbc的规范之上,因此各种各样的框架虽然有着较大的差异,但它们必定都会存在jdbc的影子。Jdbc规范在执行数据库操作的时候,主要分为以下几个重要的步骤。获取连接;创建Statement;设置参数;执行语句;处理结果。具体的流程可以参考勤JDBC类图

图(2)

在jdbc的整个操作中有几点是需要注意的,SQL语句通常是必不可少的,一般情况参数设置也是需要的,如果是查询,结果的处理也是少不了的。对于持久层框的研究我认为也需要从这些方面去加深认识,如何获取SQL,如何设置参数,如何抽取结果。

对于JdbcOperations可以看到SQL语句是需要程序员直接在程序中指定的,参数的设置与结果的提取,框架都抽取相应的回调接口例如:PreparedStatementCreator、ResultSetExtractor等,但最终的设置与抽取逻辑是要靠程序员手工来完成的。这是jdbcOperations操作接口最大的弱点,spring在抽取jdbcDaoSupport的过程中并没有使用配置文件,这是导致sql语句的提供、参数设置、结果抽取都需要程序员手工操作完成的一个很重要原因,因为它根本就不是作为持久层来设计的,它只是为了使程序员在使用jdbc的过程相对容易一些,只是jdbc的基本包装。虽然JdbcOperations的抽象缺陷非常的明显,但它的设计方式却是非常值得研究的,尤其是如果你自己打算设计一个持久层的框架时更是如此,它在其中使用大量的模板方法模式来简化重复机械的操作。

SqlMapClientOperations接口是对iBatis框架的操作抽象,它的接口相对要简单一些,接口参数主要以语句标识和参数对象为主,如果你阅读过iBatis框架的源程序,你会发现框架的底层代码仍然是jdbc,它最终需要解决的问题就是获取SQL,设置参数,抽取结果,当然这里说了一些废话,应该说不只iBatis框架最终关注这些问题,实际所有持久层框架它们最终的目标都是以一种便利的方式来解决这几个问题,最终这种“便利的方式”会形成一套框架规则。因此在学习各种持久层框架时一定抓住框架所需要解决的这几个核心问题。iBatis框架是如何完成这几个问题的呢?关键在语句标识,在程序中它虽然只是一个语句标识,但它实际表示一个语句配置,可以说它包含了解决上述三个问题的配置信息,至于它是如何通过配置来解决这几个问题需要单独分析,这里就不详加分析。对于iBatis来说我认为有两不足,第一基本的操作配置不能自动生成;第二大部分组件只能配置中完成,不能由程序员在程序中手工配置,这显得程序过于机械。

HibernateOperations接口是对Hibernate框架的操作抽象,根据Hibernate框架的特点接口主要围绕着“类”为中心,或者说是以对象为中心,因此在接口中出现了很多类型参数与类名称参数,此特点的操作主要集中在增(save)、删(delete)、改(update)、简单查询(get、load)等操作上,至于复杂的查询可能走了另一种转换体系。为什么会在大量的操作中出现“类”与“类名称”参数呢?这是由框架的特点所决定,Hibernate框架主要是以对象的思想来设计框架的,即设计者想按一个一个对象来操作数据库,前面我们已经分析过所有持久层框架最终还是要以jdbc来操作数据库,所以Hibernate就必须有一套由“类”信息向数据库配置信息过渡,进而解决数据操作的几个关键问题(获取SQL、设置参数、抽取结果),因此在接口中大量指定“类”型参数,主要是需要通过“类”信息来获取配置信息。

通过对前面几个典型框架的分析,可以发现API的形态是完全不一样,它们是由框架自身的特点所决定的,虽然它们的目标在某种程度上是一致的,比如除去jdbcTemplate其它API都需要有一种方式来获取相关配置信息的“线索”;框架很可能会抽取自身的条件组件,虽然iBatis的动态条件是在配置中直接体现的,但其它一些持久层框架一般都有在程序中表达动态条件的组件,以支持有效的查询;还可能会有分页组件。虽然它们有很多共同点,但是要将这些共同点抽取出来似乎不太可能,因为需要兼顾的问题实在太多,我们是不是应该在这众多的持久层框架之上抽取一个共同的层,我不是很明确,但是如果有这样一个共同层那当然是好的,这样可以很轻松的在各种持久层框架之间进行切换,但在对众多持久层框研究你会发现这样的抽象是艰难的。

图(3)

图(4)

图(5)

图(6)

图(7)

分享到:
评论

相关推荐

    Spring数据访问对象框架入门

    Spring Data Access Object(DAO)框架是Spring生态体系中用于数据库交互的重要部分,它简化了数据访问层的实现,使得开发者可以更专注于业务逻辑,而不是底层数据库操作。本文将深入探讨Spring DAO框架的入门知识,...

    Spring5.pdf

    5. Spring DAO:提供了数据访问对象的异常体系结构,能够简化数据访问代码的编写。 6. Spring Context:是一个配置文件,提供了一个配置Spring应用的上下文环境,是容器的运行基础。 7. Spring Web MVC:是Spring的...

    spring3.1+hibernate4+Jpa Dao

    本文将详细解析"spring3.1+hibernate4+Jpa Dao"集成的相关知识点,帮助你理解和掌握这一体系结构。 **Spring 3.1** Spring 是一个开源的应用框架,它提供了全面的编程和配置模型,用于简化Java企业级应用的开发。...

    Spring+3.x企业应用开发实战光盘源码(全)

     第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。  第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的...

    软件体系架构PPT( Spring SpringMVC Mybatis 框架基础)

    《软件体系架构:Spring、SpringMVC与Mybatis框架基础》 在当今的软件开发领域,框架的应用已经变得至关重要,它们极大地提高了开发效率,降低了出错的可能性。本资源主要聚焦于三大主流Java企业级框架——Spring、...

    JavavEE轻量级框架Struts2+Hibernate+Spring整合开发

    整合Struts2、Hibernate和Spring,首先需要在Spring配置文件中定义Bean,包括Action类、Service层接口及其实现、DAO接口及其Hibernate实现等。接着,使用Spring的AOP和DI管理这些Bean。然后,将Struts2与Spring集成...

    spring5框架学习笔记

    Spring 5 框架学习笔记 本笔记主要介绍了 Spring 5 框架的相关知识点,包括 IoC 原理分析、基于 XML 的 IoC 实现、基于 XML 的 DI 使用、基于...Spring 体系结构包括 IoC 容器、AOP 模块、JDBC 模块、事务管理模块等。

    Spring2.0宝典 源码

     本书由浅入深、全面地介绍了Spring的结构体系,内容覆盖到Spring近80%的API。全书分22章,内容涵盖了Spring的核心机制、依赖注入、资源访问、AOP框架、事务框架、整合Hibernate、DAO支持、JDBC支持、MVC框架、整合...

    SpringDemo-master.zip

    这里,Spring会管理MyBatis的SqlSessionFactory,使得MyBatis的配置融入到Spring的IoC(控制反转)体系中。同时,MyBatis的配置文件`mybatis-config.xml`可能也会存在,用于配置MyBatis的全局属性,如类型别名、日志...

    Spring.3.x企业应用开发实战(完整版).part2

    1.4 Spring体系结构 1.5 Spring 3.0的新功能 1.5.1 核心API更新到Java 5. 1.5.2 Spring表达式语言 1.5.3 可通过Java类提供IoC配置信息 1.5.4 通用类型转换系统和属性格式化系统 1.5.5 数据访问层新增OXM功能 1.5.6 ...

    尚硅谷SpringData视频观看下载链接

    SpringData是Spring生态体系的一部分,旨在通过统一的API简化数据访问。它支持多种数据存储技术,如关系型数据库(JPA、Hibernate)、NoSQL数据库(MongoDB、Couchbase)和搜索引擎(Elasticsearch)等。 2. **...

    Spring ROO

    总的来说,Spring ROO是Spring生态体系中的一个重要组成部分,它通过自动化工具和最佳实践,极大地提升了开发效率,降低了企业级应用的开发复杂性。掌握Spring ROO的使用,对于提高开发者的生产力和项目进度具有显著...

    JSF+Spring+Hibernate的实例讲解.doc

    - **高级体系结构设计**:采用多层架构,将应用划分为客户端、表示层、业务逻辑层、集成层和 EIS 层。每个层都有明确的职责,如客户端负责展示,业务逻辑层处理核心业务规则。 - **技术选型**:根据需求选择合适的...

    spring_mybatis_springmvc.zip_spring_spring mybatis_spring+mybati

    这一体系结构提供了完整的控制层、服务层和数据访问层解决方案,便于开发人员进行高效且模块化的后端开发。下面将详细讲解这三个框架的核心功能以及它们如何协同工作。 **Spring框架**: Spring是一个开源的Java...

    Spring开发笔记.pdf

    Spring的体系结构清晰分为展示层、业务层和持久层,每一层都有相应的技术框架和组件支持,同时Spring也提供了一套整合方案,允许开发者将Spring与其他流行的框架和类库进行整合。 Spring快速入门需要掌握几个关键...

    陈开雄 Spring+3.x企业应用开发实战光盘源码.zip

     第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。  第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的...

    spring3.0_jar

    Spring 3.0 是一个非常重要的Java框架,主要用于构建企业级的、基于Java的应用程序。...这个压缩包中的所有jar包正是构成Spring 3.0生态体系的基础,对于学习和使用Spring框架的开发者而言,它们是不可或缺的工具。

    Spring基础PDF版

    4. **Spring DAO**:提供了JDBC数据访问抽象层,简化了异常处理,减少与数据库交互时的代码量,并遵循统一的DAO异常层次结构。 5. **Spring ORM**:支持与多种ORM框架(如JDO、Hibernate、iBatis SQL Map)的集成,...

Global site tag (gtag.js) - Google Analytics