• 2. DAO 支持


    2. DAO 支持

    Spring 对数据访问对象(DAO)的支持旨在使以一致的方式轻松使用数据访问技术(例如 JDBC,Hibernate 或 JPA)。这使您可以轻松地在上述持久性技术之间进行切换,还使您无需担心捕获每种技术特有的异常即可进行编码。

    2.1. 一致的异常层次结构

    Spring 提供了从特定于技术的异常(例如SQLException)到其自己的异常类层次结构(以DataAccessException作为根异常)的便捷转换。这些异常包装了原始异常,因此您永远不会丢失任何可能出错的信息。

    除了 JDBC 异常,Spring 还可以包装 JPA 和 Hibernate 特定的异常,将它们转换为一组集中的运行时异常。这样,您就可以仅在适当的层中处理大多数不可恢复的持久性异常,而无需在 DAO 中使用烦人的样板捕获和抛出块以及异常声明。 (尽管您仍然可以在任何需要的地方捕获和处理异常.)如上所述,JDBC 异常(包括特定于数据库的方言)也被转换为相同的层次结构,这意味着您可以在一致的编程模型中对 JDBC 执行某些操作。 

    在 Spring 对各种 ORM 框架的支持中,上述讨论对于各种模板类均适用。如果您使用基于拦截器的类,则应用程序必须关心处理HibernateExceptionsPersistenceExceptions本身,最好分别委派SessionFactoryUtilsconvertHibernateAccessException(..)convertJpaAccessException()方法。这些方法将异常转换为与org.springframework.dao异常层次结构中的异常兼容的异常。由于未选中PersistenceExceptions,它们也可能被抛出(不过,在异常方面牺牲了通用 DAO 抽象)。

    下图显示了 Spring 提供的异常层次结构。 (请注意,图像中详细说明的类层次结构仅显示整个DataAccessException层次结构的子集.)

    异常

    何时抛出

    CleanupFailureDataAccessException 一项操作成功地执行,但在释放数据库资源时发生异常(例如,关闭一个Connection)
    DataAccessResourceFailureException 数据访问资源彻底失败,例如不能连接数据库
    DataIntegrityViolationException Insert或Update数据时违反了完整性,例如违反了惟一性限制
    DataRetrievalFailureException 某些数据不能被检测到,例如不能通过关键字找到一条记录
    DeadlockLoserDataAccessException 当前的操作因为死锁而失败
    IncorrectUpdateSemanticsDataAccessException Update时发生某些没有预料到的情况,例如更改超过预期的记录数。当这个异常被抛出时,执行着的事务不会被回滚
    InvalidDataAccessApiusageException 一个数据访问的JAVA API没有正确使用,例如必须在执行前编译好的查询编译失败了
    invalidDataAccessResourceUsageException 错误使用数据访问资源,例如用错误的SQL语法访问关系型数据库
    OptimisticLockingFailureException 乐观锁的失败。这将由ORM工具或用户的DAO实现抛出
    TypemismatchDataAccessException Java类型和数据类型不匹配,例如试图把String类型插入到数据库的数值型字段中
    UncategorizedDataAccessException 有错误发生,但无法归类到某一更为具体的异常中

    2.2. 用于配置 DAO 或存储库类的 Comments

    确保您的数据访问对象(DAO)或存储库提供异常翻译的最佳方法是使用@Repository注解。此 Comments 还使组件扫描支持可以查找和配置 DAO 和存储库,而不必为其提供 XML 配置条目。以下示例显示了如何使用@Repository注解:

    @Repository (1)
    public class SomeMovieFinder implements MovieFinder {
        // ...
    }
    

    根据使用的持久性技术,任何 DAO 或存储库实现都需要访问持久性资源。例如,基于 JDBC 的存储库需要访问 JDBC DataSource,而基于 JPA 的存储库需要访问EntityManager。完成此操作的最简单方法是使用@Autowired@Inject@Resource@PersistenceContext注解之一注入此资源依赖项。以下示例适用于 JPA 存储库:

    @Repository
    public class JpaMovieFinder implements MovieFinder {
    
        @PersistenceContext
        private EntityManager entityManager;
    
        // ...
    
    }
    

    如果您使用传统的 Hibernate API,则可以注入SessionFactory,如以下示例所示:  

    @Repository
    public class HibernateMovieFinder implements MovieFinder {
    
        private SessionFactory sessionFactory;
    
        @Autowired
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    
        // ...
    
    }
    

      

    我们在此显示的最后一个示例是对典型 JDBC 支持的。您可以将DataSource注入到初始化方法中,在该方法中,您可以使用DataSource创建JdbcTemplate和其他数据访问支持类(例如SimpleJdbcCall等)。以下示例自动连接DataSource

    @Repository
    public class JdbcMovieFinder implements MovieFinder {
    
        private JdbcTemplate jdbcTemplate;
    
        @Autowired
        public void init(DataSource dataSource) {
            this.jdbcTemplate = new JdbcTemplate(dataSource);
        }
    
        // ...
    
    }
    

      

      

  • 相关阅读:
    Scrapy框架基础使用
    python爬虫练习--爬取今日头条街拍图片
    python爬虫练习--爬取所有微博
    python爬虫练习--爬取猫眼热映口碑榜
    python练习---校园管理系统
    python爬虫练习--爬取猫眼top100电影信息
    基础篇-Python的urllib库
    1--爬虫环境安装篇
    Confluence 如何查看页面 ID
    导入 Gradle 项目到 IntelliJ IDEA
  • 原文地址:https://www.cnblogs.com/jrkl/p/14281705.html
Copyright © 2020-2023  润新知