学无先后,达者为师

网站首页 编程语言 正文

Spring Framework对DAO(Data Access Object)的支持

作者:听海边涛声 更新时间: 2024-03-15 编程语言

https://docs.spring.io/spring-framework/reference/data-access/dao.html

Spring中的数据访问对象(DAO)支持旨在使以一致的方式使用数据访问技术(如JDBC、Hibernate或JPA)变得简单。这让你能够在上述持久化技术之间轻松切换,并且还允许你在编码时不必担心捕获特定于每种技术的异常。

一致的异常层次结构

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

除了JDBC异常外,Spring还可以包装JPA和Hibernate特定的异常,将它们转换为一组针对性的运行时异常。这使你能够在适当的层中处理大多数不可恢复的持久化异常,而无需在DAO中编写繁琐的catch-and-throw块和异常声明。(当然,仍然可以在需要的地方捕获和处理异常。)JDBC异常(包括特定于数据库的方言)也转换为相同的层次结构,这意味着可以在一致的编程模型中使用JDBC执行某些操作。

前面的讨论同样适用于Spring支持的各种ORM框架中的不同模板类。如果使用基于拦截器的类,应用程序必须自行处理HibernateExceptionsPersistenceExceptions,最好是分别委托给SessionFactoryUtilsconvertHibernateAccessException(..)convertJpaAccessException(..)方法。这些方法将异常转换为与org.springframework.dao异常层次结构中的异常兼容的异常。由于PersistenceExceptions是未检查的异常,它们也可以被抛出(尽管在异常方面牺牲了通用DAO抽象)。

下面的图片展示了Spring提供的异常层次结构。(请注意,图片中详细说明的类层次结构仅显示了整个DataAccessException层次结构的一个子集)
在这里插入图片描述

用于配置DAO或Repository类的注解

确保你的数据访问对象(DAOs)或存储库(repositories)提供异常转换的最佳方式是使用@Repository注解。这个注解还允许组件扫描支持找到并配置DAO和存储库,无需为它们提供XML配置条目。下面的例子展示了如何使用@Repository注解:

@Repository
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);
	}

	// ...
}

原文链接:https://blog.csdn.net/panghuangang/article/details/136676679

  • 上一篇:没有了
  • 下一篇:没有了
栏目分类
最近更新