博客
关于我
mybatis(xml方式)多数据源异常: Invalid bound statement (not found)
阅读量:618 次
发布时间:2019-03-12

本文共 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问题。如果仍然存在问题,可以参考官方文档或社区易木手册获取更多帮助。

    转载地址:http://ziexz.baihongyu.com/

    你可能感兴趣的文章
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nginx配置文件nginx.conf中文详解(总结)
    查看>>
    Nginx配置自带的stub状态实现活动监控指标
    查看>>
    nginx配置详解、端口重定向和504
    查看>>
    Nginx配置负载均衡到后台网关集群
    查看>>
    Nginx配置限流,技能拉满!
    查看>>
    Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias
    查看>>
    Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
    查看>>
    Nginx:NginxConfig可视化配置工具安装
    查看>>
    ngModelController
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    ngrok内网穿透可以实现资源共享吗?快解析更加简洁
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>