错误

Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率。其实就是帮我们封装了一些简单的curd方法,可以直接调用,不必再重写这些简单的sql语句,类似JPA那样。

前两天创建了一个新项目,持久层框架用的是mybatis,同时引入mybatis-plus做增强工具,项目启动后,调用接口却发现报错了,报错的提醒如下:

错误的信息显示的是 “无效的绑定语句“,报错的地方正是操作sql语句的方法,从网上查了一下答案,该错误主要是数据源绑定的配置问题,于是我顺腾摸瓜,从配置数据源的地方下手。

查找原因

因为项目是做了多数据源的读写分离,所以我把数据源的动态配置整合到了一个类DataSourceConfig中,这是该类的代码:

@Configuration
@MapperScan(basePackages = "com.xjt.proxy.mapper", sqlSessionTemplateRef = "sqlTemplate")
public class DataSourceConfig {/*** 主库*/@Bean@ConfigurationProperties(prefix = "spring.datasource.master")public DataSource masterDb() {return DruidDataSourceBuilder.create().build();}/*** 从库*/@Bean@ConfigurationProperties(prefix = "spring.datasource.slave")public DataSource slaveDb() {return DruidDataSourceBuilder.create().build();}/*** 主从动态配置*/@Beanpublic DynamicDataSource dynamicDb(@Qualifier("masterDb") DataSource masterDataSource,@Autowired(required = false) @Qualifier("slaveDb") DataSource slaveDataSource) {DynamicDataSource dynamicDataSource = new DynamicDataSource();Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put(DynamicDataSourceEnum.MASTER.getDataSourceName(), masterDataSource);if (slaveDataSource != null) {targetDataSources.put(DynamicDataSourceEnum.SLAVE.getDataSourceName(), slaveDataSource);}dynamicDataSource.setTargetDataSources(targetDataSources);dynamicDataSource.setDefaultTargetDataSource(masterDataSource);return dynamicDataSource;}@Beanpublic SqlSessionFactory sessionFactory(@Qualifier("dynamicDb") DataSource dynamicDataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*Mapper.xml"));bean.setDataSource(dynamicDataSource);return bean.getObject();}@Beanpublic SqlSessionTemplate sqlTemplate(@Qualifier("sessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}@Bean(name = "dataSourceTx")public DataSourceTransactionManager dataSourceTx(@Qualifier("dynamicDb") DataSource dynamicDataSource) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dynamicDataSource);return dataSourceTransactionManager;}
}

内容没什么复杂的,主要是对主从库的数据源配置映射,以及把数据源注入SqlSessionFactory对象中,如果对该部分代码或者读写分离比较疑惑的话,可以看我之前的文章《读写分离很难吗?springboot结合aop简单就实现了》

主从库映射数据源没什么异议,想来想去应该是注入那一步有问题,然后就把目光放到了sessionFactory方法上,该方法主要是返回一个SqlSessionFactory对象,该对象是由通过新建一个SqlSessionFactoryBean对象并注入数据源后返回的,问题应该是出在这个SqlSessionFactoryBean类上,后来,经平哥(我旁边的大佬)提醒后,这里应该要换成mybatis-plus中另一个Bean工厂类,叫做MybatisSqlSessionFactoryBean,点开该类的源码,才发现该类正是拷贝了SqlSessionFactoryBean,并且重写了自己的自定义加载方法buildSqlSessionFactory

跳转到该方法的源码中,发现其中有一段代码比较重要,配置中少了这一步就会注入失败,

改动

也就是说,注入数据源的地方还需要配置mapper的扫描路径,如此一来,改动的地方也比较明确了,就是注入数据源的地方把 SqlSessionFactoryBean 改成 MybatisSqlSessionFactoryBean 后,并配置mapper文件对应的路径,也就是把sessionFactory方法改成如下代码:

@Beanpublic SqlSessionFactory sessionFactory(@Qualifier("dynamicDb") DataSource dynamicDataSource) throws Exception {MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dynamicDataSource);PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/*Mapper.xml"));return sqlSessionFactoryBean.getObject();}

这样一来,再次启动项目就可以正常操作sql语句了。

引入mybatis-plus报 Invalid bound statement错误怎么办,动动手指改一个地方就行相关推荐

  1. 如何快速解决 Mybatis 异常:Invalid bound statement (not found)

    目录 一.遇到的问题 二.分析思路 1.映射文件 2.测试类 三.解决方案 一.遇到的问题 前几日,有个工作不久的同事找我帮他解决一个 Mybatis 的问题.他写了一个增删改查,但是在启动程序的时候 ...

  2. 记录若依启动报Invalid bound statement (not found): com.xbo.system.mapper.SysConfigMapper.selectConfigList问题

    一.问题如图 二.问题描述 在使用若依RuoYi-Vue开发一段时候后,某天更新代码启动报:Invalid bound statement (not found): com.xbo.system.ma ...

  3. MyBatis报Invalid bound statement (not found)错误

    一.场景 本项目使用mybatis-plus作为orm框架,使用的是以下jar包 compile 'com.baomidou:mybatis-plus-boot-starter:3.4.0' 都知道m ...

  4. mybatis plus 常见问题Invalid bound statement (not found)

    官网: https://mp.baomidou.com/guide/faq.html#%E5%87%BA%E7%8E%B0-invalid-bound-statement-not-found-%E5% ...

  5. springboot报Invalid bound statement (not found):

    Springboot整合MyBaties,在IDEA启动时报错Invalid bound statement (not found),是mapper和对应的xml文件无法建立映射关系,一般从如下几方面 ...

  6. mybatis+atomikos出现invalid bound statement (not found)

    我在用atomikos做分布式事务的时候出现invalid bound statement (not found),网上找了好多办法都没有解决,最后我还是通过谷歌查找到解决办法. 解决办法如下: 在配 ...

  7. [MyBatis]诡异的Invalid bound statement (not found)错误

    转自:https://blog.csdn.net/z69183787/article/details/48933481 自从开始使用Maven管理项目,最近在配置MyBatis的Mapper,在Ecl ...

  8. MyBatis使用动态代理报 invalid bound statement (not found) 错

    这个问题网上大部分都说xml文件中的路径不对 或者是resources之类的问题,如果那些文章的解决方案解决不了你的问题的话,可以看一下我遇到的这种情况: 前提: mybatis-config.xml ...

  9. mybatisplus报 Invalid bound statement (not found):

    这里只介绍一下我的情况,一个很低级的错误 mybatis-plus: # mybatis将代码都托管到了github上,因此我们可以在github上找主配置文件和mapperxml文件的模板内容con ...

最新文章

  1. .net core 2.0 部署到centos 7生产环境
  2. Android-Spinner下拉列表Demo
  3. python【蓝桥杯vip练习题库】ADV-181质因数2(短除法)
  4. wampserver配置服务
  5. 关于Adapter对数据库的查询、删除操作
  6. 【Kaggle-MNIST之路】自定义程序结构(七)
  7. 第一章 TensorFlow基础——python语法(一)
  8. python保留关键字列表
  9. CUBRID学习笔记 31 通过select创建表
  10. 你必须知道的容器监控 (1) Docker自带子命令与Weave Scope
  11. php new static,PHP中new self()和new static()的区别用法
  12. 《高性能MySQL》之选择优化的数据类型
  13. 【嵌入式模块】再探ESP8266,保姆级教程
  14. 【工具】在idea中使用svn
  15. Vue实战项目开发--首页开发
  16. CPU工作方式、多核心、超线程技术详解[转贴]
  17. 华为 MATE7 调试 LOCAT 日志不输出问题
  18. 云计算第四次作业—web网站的搭建
  19. 预报精准的天气查询APP开发原理是什么
  20. 图10——判断顶点u和顶点v是否存在简单路径

热门文章

  1. avr c语言编译器,[VR虚拟现实]AVR单片机C语言编译器.doc
  2. react-native 实现渐变色背景
  3. 最菜的我打卡的第二天
  4. 《尚硅谷大数据Hadoop》教程
  5. 网易云音乐api,硅谷云音乐调用登录API出现,网络太拥挤,登录失败(最简单的解决方案,有效哦)
  6. 2022年高新技术企业认定的补贴有多少?
  7. Win10下媲美apt的包管理工具 Scoop 的安装以及常用软件清单
  8. 校园二手物品交易系统
  9. 央视“解禁”播《V字别动队》 电影全面解析
  10. 51时钟含闹钟(可按键设置)