《Spring 5 官方文档》14.DAO support

《Spring 5 官方文档》14.DAO support

原文链接  译者:fangzongzhou

14. DAO支持

14.1 介绍

在Spring中数据访问对象(DAO)旨在使JDBC,Hibernate,JPA或JDO等数据访问技术有一致的处理方法,并且方法尽可能简单。
这样就可以很容易地切换上述持久化技术,并且切换过程无需担心每种技术的特有异常。

14.2 一致的异常层级

Spring为技术特定异常提供了一个适当的转化,例如:SQLException 所属异常类层级用DataAccessException 作为根异常,这些异常包括了原来的异常,所以不会有丢失可能出错信息的风险。

除了JDBC异常,Spring也包含了Hibernate特定异常,将它们转换为一组集中的运行时异常(对JDO 和 JPA 异常也是如此),在合适的层次上处理多数不可恢复的持久化异常,而不会在dao上产生繁琐的catch-throw块和异常声明(仍然可以在认为合适的地方捕获和处理异常)。向上面提到的一样,JDBC异常(包括数据方言)也都转化为相同的层级结构,意味着在一个统一的项目模型中你也可以执行一些JDBC操作。

以上列举的Spring的各种模板类支持各种ORM框架。如果使用基于拦截器的类,那么我们的程序必须关心并处理HibernateExceptions和JDOExceptions本身,最好是通过分别授权给SessionFactoryUtils’ `convertHibernateAccessException(..)或 convertJdoAccessException()方法。这些方法将这些异常转化为与org.springframework.dao中异常层级兼容的异常。由于JDOExceptions 没有被检查,它可以被简单的抛出,这也牺牲了DAO在异常上的抽象。

下图展示了Spring提供的异常层级,(请注意:在这张图上显示出来的类层级仅仅是整个DataAccessException 的一个子集)
DataAccessException hierarachy

 

14.3 配置 DAO 或 Repository 类的注解

使用@Repository注解是数据访问对象(DAOs)或库能提供异常转换的最好方式,这个注解还允许组件扫描,查找并配置你的 DAOs 和库,并且不需要为它们提供 XML 配置文件。

1@Repository
2public class SomeMovieFinder implements MovieFinder {
3// ...
4}

任何DAO或库实现都需要访问持久的源,依赖于持久化技术的使用;例如:一个基于JDBC的库需要访问一个JDBC DataSource,一个基于JPA的库需要访问一个 EntityManager,最简单的方式就是使用 @Autowired, @Inject, @Resource 或@PersistenceContext 这些注解中的一个完成资源的依赖注入,这是一个JPA库的例子:

1@Repository
2public class JpaMovieFinder implements MovieFinder {
3 
4@PersistenceContext
5private EntityManager entityManager;
6 
7// ...
8 
9}

如果你使用传统的Hibernate API,你可以注入SessionFactory:

01@Repository
02public class HibernateMovieFinder implements MovieFinder {
03 
04private SessionFactory sessionFactory;
05 
06@Autowired
07public void setSessionFactory(SessionFactory sessionFactory) {
08this.sessionFactory = sessionFactory;
09}
10 
11// ...
12 
13}

最后一个例子我们将在这里展示典型的JDBC支持,你将会在初始化方法中注入 DataSource ,
在初始化方法中,你将使用这个DataSource创建一个JdbcTemplate 和其他与SimpleJdbcCall相似的数据访问支持类。

01@Repository
02public class JdbcMovieFinder implements MovieFinder {
03 
04private JdbcTemplate jdbcTemplate;
05 
06@Autowired
07public void init(DataSource dataSource) {
08this.jdbcTemplate = new JdbcTemplate(dataSource);
09}
10 
11// ...
12 
13}

 

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《Spring 5 官方文档》14.DAO support

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcMappingContext' defined in class path resource [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]: Unsatisfied dependency expressed through method 'jdbcMappingContext' parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcCustomConversions' defined in class path resource [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.jdbc.core.convert.JdbcCustomConversions]: Factory method 'jdbcCustomConversions' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcDialect' defined in class path resource [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.relational.core.dialect.Dialect]: Factory method 'jdbcDialect' threw exception; nested exception is org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException: Cannot determine a dialect for org.springframework.jdbc.core.JdbcTemplate@2060df8. Please provide a Dialect. at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowir
最新发布
03-24
### Spring Boot 中 JdbcMappingContext 和 JdbcDialect 的 Bean 创建失败问题分析 在 Spring Boot 应用程序中,`UnsatisfiedDependencyException` 是一种常见的错误,通常表示某个依赖项无法被正确解析或注入。具体到 `JdbcMappingContext` 和 `JdbcDialect` 的场景下,这种问题可能由多种原因引起。 #### 错误根源分析 当应用程序尝试加载 `JdbcMappingContext` 或者 `JdbcDialect` 时,如果未找到合适的数据库方言(dialect),或者缺少必要的配置文件,则会抛出类似的异常[^1]。此外,在某些情况下,默认的自动装配机制可能导致冲突或不匹配的情况发生[^3]。 以下是几个常见原因及其解决方案: --- #### 原因一:缺失数据库驱动类 如果没有引入正确的 JDBC 驱动库,Spring 将无法识别目标数据库并设置相应的 Dialect 类型。例如,对于 MySQL 数据库而言,需要确保 Maven 或 Gradle 文件中有如下依赖声明: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` 如果使用其他类型的数据库,请替换为对应的连接器版本号[^4]。 --- #### 原因二:application.properties/yml 缺少必要参数 为了使 Spring 能够正确定位数据源以及初始化所需的组件,必须提供完整的配置信息。以下是一个典型的例子: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 显式指定 MyBatis 所需路径和其他选项 mybatis.config-location=classpath:/mybatis-config.xml mybatis.mapper-locations=classpath*:mappers/**/*.xml ``` 上述片段中的 URL 参数部分非常重要;特别是针对较新的 MySQL 版本,建议加入附加查询字符串以规避兼容性隐患[^2]。 --- #### 原因三:默认 Autowiring 行为引发冲突 有时开发者可能会无意间启用全局范围内的自动装配功能 (`default-autowire`) ,这反而增加了不必要的复杂度甚至造成循环引用等问题。因此推荐的做法是在特定领域对象上显式标注所需的服务实例而不是依靠框架推测完成绑定操作。 比如下面展示了一个改进后的 DAO 层定义方式: ```java @Repository public class UserRepositoryImpl implements UserMapper { private final DataSource dataSource; @Autowired public UserRepositoryImpl(DataSource ds){ this.dataSource = ds; } } ``` 通过构造函数注入的形式可以有效减少潜在风险同时提高代码可读性和维护便利程度。 --- #### 解决方案总结 综合以上讨论可知,要彻底消除此类异常可以从以下几个方面入手: 1. **确认已安装对应关系型数据库引擎的支持插件**; 2. **仔细核查项目根目录下的资源配置文档内容是否齐全无误**; 3. **调整原有粗放式的依赖管理策略转而采取精细化控制手段来降低不确定性因素的影响权重**. 最后提醒一点就是务必保持各个子模块之间界限清晰互不影响从而构建起更加健壮稳定的应用体系结构! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值