博客
关于我
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 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>
    Nginx 如何代理转发传递真实 ip 地址?
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 学习(一):Nginx 下载和启动
    查看>>
    nginx 常用指令配置总结
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 源码完全注释(11)ngx_spinlock
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的 SSL 模块安装
    查看>>
    Nginx 的优化思路,并解析网站防盗链
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    nginx 禁止以ip形式访问服务器
    查看>>
    Nginx 结合 consul 实现动态负载均衡
    查看>>