DAO 支持
Spring 中的数据访问对象 (DAO) 支持旨在使其易于使用 数据访问技术(如 JDBC、Hibernate 或 JPA)以一致的方式。这 让你相当容易地在上述持久化技术之间切换, 它还允许您编写代码,而无需担心捕获 特定于每种技术。
一致的异常层次结构
Spring 提供了从特定于技术的异常(例如到其自己的异常类层次结构)的便捷转换,该层次结构具有
root 异常。这些异常包装了原始异常,因此永远不会有
您可能会丢失有关可能出错的任何信息的任何风险。SQLException
DataAccessException
除了 JDBC 异常之外, Spring 还可以包装特定于 JPA 和 Hibernate 的异常。 将它们转换为一组 Focused Runtime 异常。这让你处理大多数 不可恢复的持久性异常,而没有 DAO 中烦人的样板捕获和抛出块和异常声明。 (不过,您仍然可以在需要的任何位置捕获和处理异常。如上所述, JDBC 异常(包括特定于数据库的方言)也会转换为相同的 层次结构,这意味着您可以在一致的 编程模型。
前面的讨论适用于 Spring 支持中的各种模板类
适用于各种 ORM 框架。如果使用基于侦听器的类,则应用程序必须
关心处理和自身,最好由
分别委托给 的 或 方法。这些方法将异常
添加到与 Exception 层次结构中的异常兼容的 Exception。如果不加以控制,它们也可能被抛出
(不过,在例外方面牺牲了通用的 DAO 抽象)。HibernateExceptions
PersistenceExceptions
convertHibernateAccessException(..)
convertJpaAccessException(..)
SessionFactoryUtils
org.springframework.dao
PersistenceExceptions
下图显示了 Spring 提供的异常层次结构。
(请注意,图中详述的类层次结构仅显示整个层次结构的一个子集。DataAccessException
![DataAccessException 异常](https://docs.spring.io/spring-framework/reference/6.2.0/_images/DataAccessException.png)
用于配置 DAO 或存储库类的注释
保证您的数据访问对象 (DAO) 或存储库提供
exception translation 是使用 annotation。此注释还
让组件扫描支持人员查找和配置您的 DAO 和存储库
而无需为它们提供 XML 配置条目。以下示例显示了
如何使用注释:@Repository
@Repository
-
Java
-
Kotlin
@Repository (1)
public class SomeMovieFinder implements MovieFinder {
// ...
}
1 | 注释。@Repository |
@Repository (1)
class SomeMovieFinder : MovieFinder {
// ...
}
1 | 注释。@Repository |
任何 DAO 或存储库实现都需要访问持久化资源,
取决于使用的持久性技术。例如,基于 JDBC 的存储库
需要访问 JDBC ,而基于 JPA 的存储库需要访问 .实现此目的的最简单方法是具有此资源依赖项
使用 、 或 注释之一注入。以下示例适用于 JPA 存储库:DataSource
EntityManager
@Autowired
@Inject
@Resource
@PersistenceContext
-
Java
-
Kotlin
@Repository
public class JpaMovieFinder implements MovieFinder {
@PersistenceContext
private EntityManager entityManager;
// ...
}
@Repository
class JpaMovieFinder : MovieFinder {
@PersistenceContext
private lateinit var entityManager: EntityManager
// ...
}
如果使用经典的 Hibernate API,则可以注入 ,如下所示
示例显示:SessionFactory
-
Java
-
Kotlin
@Repository
public class HibernateMovieFinder implements MovieFinder {
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
// ...
}
@Repository
class HibernateMovieFinder(private val sessionFactory: SessionFactory) : MovieFinder {
// ...
}
我们在这里展示的最后一个示例是典型的 JDBC 支持。您可以将 注入到初始化方法或构造函数中,在那里您将使用此 .以下示例自动装配 :DataSource
JdbcTemplate
SimpleJdbcCall
DataSource
DataSource
-
Java
-
Kotlin
@Repository
public class JdbcMovieFinder implements MovieFinder {
private JdbcTemplate jdbcTemplate;
@Autowired
public void init(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// ...
}
@Repository
class JdbcMovieFinder(dataSource: DataSource) : MovieFinder {
private val jdbcTemplate = JdbcTemplate(dataSource)
// ...
}
有关如何执行以下操作的详细信息,请参阅每种持久化技术的具体覆盖范围 配置 Application Context 以利用这些注释。 |