gpt4 book ai didi

Spring DAO vs Spring ORM vs Spring JDBC

转载 作者:行者123 更新时间:2023-12-03 04:52:00 25 4
gpt4 key购买 nike

我正在研究 Spring 支持的数据访问技术,我注意到它提到了多个选项,我不确定它们之间的区别:

  • Spring-DAO ( http://docs.spring.io/spring/docs/2.0.8/reference/dao.html )
  • Spring-ORM ( http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/orm.html )
  • Spring-JDBC ( http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html )

  • 据我了解,Spring JDBC 提供了用于减少样板代码以通过简单的旧方式访问数据库的模板 - 您编写自己的 SQL 查询。

    Spring-ORM 提供了通过 ORM 技术访问数据库的简化模板,例如 Hibernate、My(i)Batis 等。

    Spring-DAO 根据 Spring 的网站:

    The Data Access Object (DAO) support in Spring is aimed at making it easy to work with data access technologies like JDBC, Hibernate or JDO in a consistent way



    我对 ORM 与 JDBC 有点清楚,因为它们针对不同的访问数据库的方式。但是 Spring-DAO 简直令人困惑!

    任何人都可以澄清这三者之间究竟有什么区别?
    在哪些情况下应该优先选择哪个?

    另外,还有一个项目 Spring-DATA也可用 ( http://projects.spring.io/spring-data/) 现在,它是 Spring 支持的所有数据访问技术的父项目,还是只是 Spring-DAO 的一个新名称?

    最佳答案

    以下是对每项提到的技术的介绍。

    Spring-DAO

    Spring-DAO 不是严格意义上的 spring 模块,而是应该指示您编写 DAO 并写好它们的约定。因此,它既不提供接口(interface)、实现或模板来访问您的数据。在编写 DAO 时,您应该使用 @Repository 对它们进行注释,以便将与底层技术(JDBC、Hibernate、JPA 等)相关联的异常一致地转换为正确的 DataAccessException 子类。

    例如,假设您现在正在使用 Hibernate,并且您的服务层捕获 HibernateException 以便对其使用react。如果您更改为 JPA,您的 DAO 接口(interface)不应更改,并且服务层仍将使用捕获 HibernateException 的块进行编译,但您永远不会进入这些块,因为您的 DAO 现在正在抛出 JPA PersistenceException 。通过在 DAO 上使用 @Repository ,与底层技术相关的异常被转换为 Spring DataAccessException ;您的服务层捕获这些异常,如果您决定更改持久性技术,由于 spring 已翻译 native 异常,仍将抛出相同的 Spring DataAccessExceptions

    但是请注意,由于以下原因,这限制了使用:

  • 通常不应捕获持久性异常,因为提供程序可能已回滚事务(取决于确切的异常子类型),因此不应使用替代路径继续执行。
  • 提供者中的异常层次结构通常比 Spring 提供的要丰富,并且没有从一个提供者到另一个提供者的明确映射。依赖这个是危险的。
    但是,使用 @Repository 注释 DAO 是个好主意,因为扫描过程会自动添加 bean。此外,Spring 可能会向注解添加其他有用的功能。

  • Spring-JDBC

    Spring-JDBC 提供了 JdbcTemplate 类,它删除了管道代码并帮助您专注于 SQL 查询和参数。您只需要使用 DataSource 对其进行配置,然后您就可以编写如下代码:
    int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);

    Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
    rs -> new Person(rs.getString(1), rs.getString(2)),
    134561351656L);

    Spring-JDBC 还提供了一个 JdbcDaoSupport,你可以扩展它来开发你的 DAO。它基本上定义了 2 个属性:一个 DataSource 和一个 JdbcTemplate,它们都可用于实现 DAO 方法。它还提供了从 SQL 异常到 Spring DataAccessExceptions 的异常翻译器。

    如果您打算使用普通的 jdbc,这就是您需要使用的模块。

    Spring ORM

    Spring-ORM 是一个伞形模块,涵盖了很多持久化技术,即 JPA、JDO、Hibernate 和 iBatis。对于这些技术中的每一种,Spring 都提供了集成类,使每种技术都可以按照 Spring 的配置原则使用,并与 Spring 事务管理顺利集成。

    对于每种技术,配置基本上包括将 DataSource bean 注入(inject)某种 SessionFactoryEntityManagerFactory 等 bean。对于纯 JDBC,不需要此类集成类(JdbcTemplate 除外),因为 JDBC 仅依赖于 DataSource。

    如果你打算使用像 JPA 或 Hibernate 这样的 ORM,你将不需要 spring-jdbc,而只需要这个模块。

    Spring 数据

    Spring-Data 是一个伞形项目,它提供了一个通用 API 来定义如何以更通用的方式访问数据(DAO + 注释),涵盖 SQL 和 NOSQL 数据源。

    最初的想法是提供一种技术,以便开发人员以与技术无关的方式编写 DAO(finder 方法)和实体类的接口(interface),并且仅基于配置(DAO 和实体上的注释 + spring 配置,无论是xml-or java-based),决定了实现技术,无论是JPA(SQL)还是redis、hadoop等(NOSQL)。

    如果您遵循 spring 为 finder 方法名称定义的命名约定,则对于最简单的情况,您甚至不需要提供与 finder 方法对应的查询字符串。对于其他情况,您必须在 finder 方法的注释内提供查询字符串。

    加载应用程序上下文时,spring 为 DAO 接口(interface)提供代理,其中包含与数据访问技术相关的所有样板代码,并调用配置的查询。

    Spring-Data 专注于非 SQL 技术,但仍然为 JPA(唯一的 SQL 技术)提供了一个模块。

    下一步是什么

    了解所有这些后,您现在必须决定选择什么。好消息是,您无需为该技术做出明确的最终选择。这其实就是 Spring 的力量所在:作为开发者,你在写代码的时候专注于业务,如果你做得好,改变底层技术是一个实现或配置细节。
  • 使用实体的 POJO 类定义数据模型,并使用 get/set 方法来表示实体属性和与其他实体的关系。您当然需要根据技术对实体类和字段进行注释,但就目前而言,POJO 已足够开始。现在只需专注于业务需求。
  • 为您的 DAO 定义接口(interface)。 1 个 DAO 正好涵盖 1 个实体,但您肯定不需要为每个实体都使用 DAO,因为您应该能够通过导航关系加载其他实体。按照严格的命名约定定义 finder 方法。
  • 基于此,其他人可以开始在服务层上工作,并为您的 DAO 进行模拟。
  • 您学习不同的持久性技术(sql、no-sql)以找到最适合您需求的技术,并选择其中一种。基于此,您可以注释实体并实现 DAO(或者,如果您选择使用 spring-data,则让 spring 为您实现它们)。
  • 如果业务需求不断发展,而你的数据访问技术不足以支持它(比如,你从JDBC和一些实体开始,但现在需要更丰富的数据模型,JPA是更好的选择),你将不得不改变实现 DAO,在实体上添加一些注释并更改 spring 配置(添加 EntityManagerFactory 定义)。您的业​​务代码的其余部分不应受到更改的其他影响。

  • 注:交易管理

    Spring 提供了一个用于事务管理的 API。如果您打算使用 spring 进行数据访问,那么您还应该使用 spring 进行事务管理,因为它们可以很好地集成在一起。 spring支持的每一种数据访问技术,都有匹配的本地事务的事务管理器,如果需要分布式事务也可以选择JTA。它们都实现了相同的 API,因此(再次)技术选择只是一个可以更改的配置,而不会进一步影响业​​务代码。

    注意:Spring 文档

    您提到的 Spring 文档的链接相当陈旧。这是最新版本(4.1.6,涵盖所有主题)的文档:
  • 单个 html 页面:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/
  • PDF:http://docs.spring.io/spring/docs/current/spring-framework-reference/pdf/spring-framework-reference.pdf

  • Spring-data 不是 Spring 框架的一部分。有一个通用模块,您应该首先阅读以习惯这些原则。文档可以在这里找到:
  • 单个 html 页面:http://docs.spring.io/spring-data/data-commons/docs/1.9.2.RELEASE/reference/html/
  • PDF:http://docs.spring.io/spring-data/data-commons/docs/1.9.2.RELEASE/reference/pdf/spring-data-commons-reference.pdf
  • 关于Spring DAO vs Spring ORM vs Spring JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24990400/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com