调用Mybatis plus中的saveBatch方法报找不到表的问题

 更新时间:2024年03月13日 08:41:53   作者:小灰灰-58  
在用Mybatis plus开发的项目中,用自带的API批量保存的方法saveBatch操作时,发现报没有找到表的错误,本文就来详细的介绍一下解决方法,感兴趣的可以了解一下

1.问题现象

在用Mybatis plus开发的项目中,用自带的API批量保存的方法saveBatch操作时,发现报没有找到表的错误。

错误日志截图如下:

image-20240307133901592

表实际是存在的,且发现其他的方法都没有问题,包括save、update等单个的方法,都是正常的。百思不得其解,配置和代码都没有问题。

下面是该数据源对应的配置文件。

dataSourceConfig中配置的mapperLocations的位置:

其apollo中配置的value值为:classpath*:/mapper/*.xml

image-20240307134854615

原来的maper.xml路径:

image-20240307133520530

2.问题分析

在项目中用了2个数据源,上面是其中的一个数据源。

另一个数据源的mapper.xml配置的路径是:

image-20240307212904427

其apollo中配置的value值也为:classpath*:/mapper/*.xml

本来是想保存数据到A数据库,结果是执行的是另一个数据库B,其实是因为 SqlSessionFactory 错误导致的。

项目中有2个数据源,分别用的不同的 SqlSessionFactory。

经分析跟踪代码后发现执行saveBatch后最终调用到了这个方法:

 public static boolean executeBatch(Class<?> entityClass, Log log, Consumer<SqlSession> consumer) {
        SqlSessionFactory sqlSessionFactory = sqlSessionFactory(entityClass);
        SqlSessionHolder sqlSessionHolder = (SqlSessionHolder) TransactionSynchronizationManager.getResource(sqlSessionFactory);
        boolean transaction = TransactionSynchronizationManager.isSynchronizationActive();
        if (sqlSessionHolder != null) {
            SqlSession sqlSession = sqlSessionHolder.getSqlSession();
            //原生无法支持执行器切换,当存在批量操作时,会嵌套两个session的,优先commit上一个session
            //按道理来说,这里的值应该一直为false。
            sqlSession.commit(!transaction);
        }
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
        if (!transaction) {
            log.warn("SqlSession [" + sqlSession + "] was not registered for synchronization because DataSource is not transactional");
        }

com.baomidou.mybatisplus.core.metadata.TableInfoHelper 中 initTableInfo方法会将每个实体类与对应的数据库配置保存到缓存:TABLE_INFO_CACHE

img

也就是,我们在创建 SqlSessionFactory 时候设置的 setMapperLocations, 设置路径下的所有mapper.xml 对应的实体都会保存对应的数据库配置。

因此,我们需要将不同的 SqlSessionFactory 配置,用不同的 mapper 目录来扫描。不同数据源的操作,放在各自的 mapper 子目录下,作区分。

上面我们定义2个SqlSessionFactory中配置的mapper文件路径是一样的。

由于 classpath*:mapper/**/*Mapper.xml 路径一样,导致初始化实体类和数据库配置对应关系,被覆盖的现象。
即同样的 mapper.xml 文件中被不同的 SqlSessionFactory 扫描了两次,导致mapper.xml中的实体类信息只有一种SqlSessionFactory信息。

3.解决办法

需要将其中的一个数据源对应的mapper文件映射的路径改一下,改成和另一个数据源配置的路径不同,就可以了。

修改后的路径:

image-20240307134715807

到此这篇关于调用Mybatis plus中的saveBatch方法报找不到表的问题的文章就介绍到这了,更多相关Mybatis plus saveBatch找不到表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 在MyBatis中进行分页查询的两种方法详解

    在MyBatis中进行分页查询的两种方法详解

    在 MyBatis 中进行分页查询通常有两种方法:一种是通过手动拼接 LIMIT 和 OFFSET,另一种是使用 MyBatis 插件(如 MyBatis-PageHelper)来自动处理分页逻辑,下面分别介绍这两种方法,需要的朋友可以参考下
    2025-11-11
  • 详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    这篇文章主要介绍了详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • java 非对称加密算法DH实现详解

    java 非对称加密算法DH实现详解

    这篇文章主要介绍了java 非对称加密算法DH实现详解 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Java源码解析HashMap成员变量

    Java源码解析HashMap成员变量

    今天小编就为大家分享一篇关于Java源码解析HashMap成员变量,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • springboot在filter中如何用threadlocal存放用户身份信息

    springboot在filter中如何用threadlocal存放用户身份信息

    这篇文章主要介绍了springboot中在filter中如何用threadlocal存放用户身份信息,本文章主要描述通过springboot的filter类,在过滤器中设置jwt信息进行身份信息保存的方法,需要的朋友可以参考下
    2024-07-07
  • Java中token的存储和获取实例代码

    Java中token的存储和获取实例代码

    关于java获取微信Token验证的问题相信很多人都遇见过,尤其是对刚接触微信开发的人来说确实有点棘手,下面这篇文章主要给大家介绍了关于Java中token存储和获取的相关资料,需要的朋友可以参考下
    2022-08-08
  • java远程调用接口、URL的方式代码

    java远程调用接口、URL的方式代码

    我们都知道接口有自己本地的,也有远程别人写好的,而调用远程接口的就需要使用远程调用啦,这篇文章主要给大家介绍了关于java远程调用接口、URL的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • idea导入项目框架的详细操作方法

    idea导入项目框架的详细操作方法

    大家使用idea开发工具时经常会需要导入项目框架,纠结该怎么操作呢,今天小编给大家分享一篇图文教程,帮助大家解决idea导入项目框架的问题,感兴趣的朋友一起看看吧
    2021-05-05
  • 解析Java 中for循环和foreach循环哪个更快

    解析Java 中for循环和foreach循环哪个更快

    这篇文章主要介绍了Java中for循环和foreach循环哪个更快示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • java实现猜拳游戏试题

    java实现猜拳游戏试题

    这篇文章主要为大家详细介绍了java实现猜拳游戏试题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03

最新评论