mybatis(xml方式)多数据源异常: Invalid bound statement (not found)
发布日期:2021-05-15 22:07:57 浏览次数:8 分类:精选文章

本文共 3993 字,大约阅读时间需要 13 分钟。

在使用MyBatis进行多数据源配置时,本文将详细介绍如何解决在配置过程中抛出BindingException的问题。该问题表明系统未能找到对应的映射陈述。

1. 出现问题的情况

当使用注解式配置多数据源(如@ContMinttrans)时,若未能正确配置Mapper文件的路径,可能会导致以下异常:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

此错误提示系统未能找到对应的映射\ab。?SQL文件。

2. 为什么会发生问题

在传统的XML配置中,MyBatis默认通过application.properties读取Mapper文件路径:

mybatis.mapper-locations=classpath:mappers/**/*.xml

但是使用注解配置时(如使用@.contMinttrans注解),这种方法无法有效读取Mapper文件的位置,因为注解配置可能不再使用默认的Mapper文件加载策略。

3. 解决方法

为了解决这个问题,我们需要在生成SqlSessionFactory的过程中手动指定Mapper文件的位置。以下是详细的配置步骤:

3.1 在SqlSessionFactory配置类中添加Mapper路径

首先,添加一个用于关联Mapper路径的Bean到你的Spring配置类中。例如,在MyBatisConfig类中:

import org.mybatis.springably.dao.*;import org.mybatis.springably.dao.mapper.*;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.transaction.annotation.Transactional;import static org.mybatis.springably.transaction_manager 事务管理逻辑。@Configuration@Transactionalpublic class MyBatisConfig {    @Autowired    private DataSource primaryDataSource;    @Autowired    private DataSource secondaryDataSource;    @Bean(name = "sqlSessionFactory")    public SqlSessionFactory sqlSessionFactory() throws Exception {        // 这里需要将不同数据源的Mapper 加入到SqlSessionFactory中        final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();        // 为每个数据源创建不同的SqlSessionFactory?或者统一用一个?        // 我们这里用不同的事务管理器接管不同的数据源        // 使用双数据源事务管理器        MultipleDataSourceTransactionManager transactionManager = new MultipleDataSourceTransactionManager(                primaryDataSource,                 secondaryDataSource,                "defaultTurkishLoader"        );                // 添加Mapper文件路径        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()                .getResources("classpath:mappers/**/*.xml"));                // 配置事务管理器        sqlSessionFactoryBean.setTransactionManager(transactionManager);                return (SqlSessionFactory) sqlSessionFactoryBean.getObject();    }}

当然,在实际应用中,可能需要根据实际需要调整DataSource的定义以及事务管理器的配置。

3.2 确保Mapper文件路径正确

确保你的Mapper文件都存放在mappers目录下的正确位置,并遵循一定的命名规范(比如说包命名与接口命名一致)。例如:

mappers/  └── mypackage/      ├── MyMapper.xml    └── AnotherMapper.xml

这些文件应配套对应的接口类。

3.3 使用事务管理器支持多数据源

为了管理多个数据源的交易,使用MultipleDataSourceTransactionManager更为合适。它可以支持不同的数据源进行事务操作。

示例:

import org.mybatis.springframework.transaction管理.MultipleDataSourceTransactionManager;// 初始化两个数据源DataSource primary = new DataSource();DataSource secondary = new DataSource();// 配置交易管理器MultipleDataSourceTransactionManager transactionManager = new MultipleDataSourceTransactionManager(    primary,    secondary,    "事务管理器名称");// 使用时,注入这个transactionManager来管理事务@Transactional(transactionManager = "事务管理器名称")public class ServiceImpl {        @Autowired    private SqlSessionFactory sqlSessionFactory;    @Autowired    private MultipleDataSourceTransactionManager txManager;    public void save(Data entity) {        // 这里选择使用哪个数据源?        // 可以根据业务逻辑选择使用primary或secondary        SqlSession session = sqlSessionFactory.openSession(PrimaryDataSource.class);        try {            // 定义要操作的SQL            SqlUpdate sqlUpdate = sqlSessionFactory.update(                new SQL("insert into table values (:entity)"),                entity            );            executeUpdate(sqlUpdate);        } catch (Exception e) {            throw new RuntimeException("保存失败,Rollback已进行", e);        } finally {            session.close();        }    }}

在实际开发中,可能需要调整语法细节,具体取决于你所使用的MyBatis版本和框架。

4. 测试和验证

在完成上述配置后,建议进行如下测试:

  • 单独测试Mapper是否可用

    • 使用SQL调试工具,如MyEyes,可以验证 Mapper SQL是否正确生成。
  • 测试事务管理

    • 执行一个需要修改多个数据源的事务,确保它们可以一起被提交或回滚。
  • 检查数据源连接

    • 确保每个数据源的连接配置正确,没有连接问题。
  • 5. 常见问题

    • Mapper文件未找到

      • 检查文件路径是否正确,确保文件存在。
      • 检查包命名是否与接口命名一致。
    • 事务管理问题

      • 确保使用MultipleDataSourceTransactionManager
      • 注确保事务管理器名称正确,并配置正确。
    • 版本不兼容

      • 确保使用的MyBatis和Spring的版本相容。
      • 查看文档和官方示例。

    通过以上步骤,应该可以解决多数据源配置中的MyBatis问题。如果仍然存在问题,可以参考官方文档或社区易木手册获取更多帮助。

    上一篇:STM32L051C8T6 HAL库 stop模式下的低功耗 RTC+外部中断唤醒 总结+源码
    下一篇:sql中的group by

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月11日 05时55分53秒