Spring 5.2.2 数据访问 (15)

Spring中的数据访问对象(DAO)是达到数据一致性而使用的数据访问技术(如JDBC、Hibernate或JPA)。可以相当容易的在上述持久性技术之间进行切换,而且它还允许你编写代码而不必担心捕获特定于每种技术的异常。
一致的异常层次结构
Spring提供了从特定的异常(例如SQLException )到本身的异常类(其中DataAccessException 是异常)的方便转换。这些异常将原始异常封装起来,这样就不会有任何可能丢失任何可能出错的信息的风险。

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

前面的讨论适用于Spring对各种ORM框架的支持中的各种模板类。如果使用基于拦截器的类,应用程序必须关心处理HibernateExceptions 和PersistenceExceptions 本身,最好是分别委托给SessionFactoryUtils的 convertHibernateAccessException(…)或convertJpaAccessException()方法。这些方法将异常转换为与org.springframework.dao异常层次结构中的异常兼容的异常。由于PersistenceExceptions 未经检查,它们也可能被抛出(不过,牺牲了异常方面的通用DAO抽象)。

下图显示了Spring提供的异常层次结构。(注意,图中详细描述的类层次结构仅显示整个DataAccessException 层次结构的一个子集。)
在这里插入图片描述
用于配置DAO或Repository 类的注解
保证数据访问对象(dao)或Repository提供异常转换的最佳方法是使用@Repository注解。此注解还允许组件扫描支持查找和配置dao和Repository,而无需为它们提供XML配置项。下面的示例演示如何使用@Repository注解:

   @Repository 
public class SomeMovieFinder implements MovieFinder {
    // ...
}

任何DAO或Repository实现都需要访问持久性资源,这取决于所使用的持久性技术。例如,基于JDBC的存储库需要访问JDBC DataSource,而基于JPA的存储库需要访问EntityManager。最简单的方法是通过使用@Autowired, @Inject, @Resource或@@PersistenceContext注解之一注入这个resource 中。以下示例适用于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 注入到初始化方法或构造方法中,在这里你可以使用此数据源创建JdbcTemplate 和其他数据访问支持类(如SimpleJdbcCall 和其他类)。以下示例自动装配DataSource:

@Repository
public class JdbcMovieFinder implements MovieFinder {

    private JdbcTemplate jdbcTemplate;

    @Autowired
    public void init(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    // ...
}
发布了0 篇原创文章 · 获赞 0 · 访问量 612

猜你喜欢

转载自blog.csdn.net/qq_41490913/article/details/105017455