前言

为了让我的SqlUtil用起来更香,我准备将SqlHelper中的saveOrUpdateBatch方法的参数从Class<?> mapper换成mapper的实体类,再通过mapper.getClass()的方式获取其真实类。

报错信息

如果是批量插入会报:

Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.sun.proxy.$Proxy129.insert

如果是执行批量更新则会报:

Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.sun.proxy.$Proxy129.updateById

代码如下:

    public static <T extends BaseEntity, R extends BaseMapper<T>> void saveBatch(Class<R> mapperClass, List<T> entityList, Long userId) {saveBatch(mapperClass, entityList, userId, 10000);}public static <T extends BaseEntity, R extends BaseMapper<T>> void saveBatch(R mapper, List<T> entityList, Long userId) {saveBatch(mapper.getClass(), entityList, userId, 10000);}public static <T extends BaseEntity, R extends BaseMapper<T>> void saveBatch(Class<R> mapperClass, List<T> entityList, Long userId, int batchSize) {if (entityList.size() == 0) {return;}T t = entityList.get(0);Class<T> entityClass = (Class<T>) t.getClass();SqlHelper.saveOrUpdateBatch(entityClass, mapperClass, log, entityList, batchSize, (sqlSession, entity) -> {// INFO: DCTANT: 2021/12/27 insert判断,返回true则是走insert代码,返回false则会走后面的update代码if (entity == null) {return false;}Long id = entity.getId();if (id == null) {// INFO: DCTANT: 2021/12/27 insert前加一些自己必要的业务逻辑,如setCreateTime、setDel、setVersion等等insertNecessaryField(entity, userId);return true;} else {// INFO: DCTANT: 2021/12/27 去执行update的代码return false;}}, (sqlSession, entity) -> {// INFO: DCTANT: 2021/12/27 判断为update,然后执行必要操作 if (entity == null) {return;}// INFO: DCTANT: 2021/12/27 update前加一些自己的业务逻辑,如setUpdateTime等等updateNecessaryField(entity, userId);MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();// INFO: DCTANT: 2022/8/22 参数需要为Constants.ENTITY,也就是里面的et,否则会报et这个参数无法找到param.put(Constants.ENTITY, entity);String sqlStatement = SqlHelper.getSqlStatement(mapperClass, SqlMethod.UPDATE_BY_ID);sqlSession.update(sqlStatement, param);});}

这个问题一开始报的让人摸不着头脑,若不是开了上帝视角,从前言中已经知道大概的问题原由,真是让人一头雾水,proxy类是哪来的,insert和updateById方法这两个方法在mapper中本来就有,凭什么会找不到!

这里一共三种写法,其中2、3是等价的

第一种写法打断点可得知拿到的就是Mapper它自己本身的类

这种写法能够反射获取其中的insert和updateById方法。

而第二、三种方法打断点获得的类是

实际是Java的代理类,Proxy类,这里面哪会存在insert和updateById方法,这就是报错的原因。所以方法不能胡乱抽取,这种就属于得不偿失,且无解。只能将本身的Class传入才能不报错,删除刚才的saveBatch(Class<R> mapperClass, List<T> entityList, Long userId)这个方法即可。

如果大家有什么其他解法可以指出,本人虚心接受。

【报错记录】MybatisPlus报Mapped Statements collection does not contain value for...相关推荐

  1. mybatis报错:java.lang.IllegalArgumentException: Mapped Statements collection does not contain

    在做mybatis案例的时候发现了一个问题,报错如下: org.apache.ibatis.exceptions.PersistenceException: ### Error querying da ...

  2. 解决Spring Boot报错Mapped Statements collection already contains value for...Error while adding the mapp

    解决Spring Boot报错Mapped Statements collection already contains value for...Error while adding the mapp ...

  3. 记录Mybatis报Mapped Statements collection already contains value for 的错误的原因

    在一次提供升级包让同事升级后,启动服务时出现Mybatis报Mapped Statements collection already contains value for 的错误,导致无法启动. 1. ...

  4. oracle 被另一用户锁定,Oracle报错记录被另外一个用户锁定的解决方案

    原因 当一个用户对数据进行修改时,若没有进行提交或者回滚,Oracle不允许其他用户修改该条数据,在这种情况下修改,就会出现:"记录被另外一个用户锁定"错误. 解决 查询用户.数据 ...

  5. php curl 不验证ssl,PHP Curl https跳过ssl证书认证报错记录及解决

    PHP Curl https跳过ssl证书认证报错记录及解决 function get($url = '', $cookie = '') { $ch = curl_init(); curl_setop ...

  6. ROS安装与报错记录

    ubuntu18.04 安装ros-melodic的踩最全的坑的记录 目录 ubuntu18.04 安装ros-melodic的踩最全的坑的记录 ubuntu 18.04 ros-melodic 安装 ...

  7. 我的ssis和ssas报错记录

    我的ssis和ssas报错记录 我的数据库装的是SQL Server 2005标准版本的,在这个版本里不具有数据透视功能, 所以解决这个的办法,只有把安装更高级的版本了,有 开发版和企业版,企业版要求 ...

  8. mongodb报错:Problem inserting to mongo collection: no reachable servers

    文章目录 mongodb报错:Problem inserting to mongo collection: no reachable servers mongodb报错:Problem inserti ...

  9. npm install安装失败,报错记录之The operation was rejected by your operating system. node-sass无法安装,且禁用淘宝镜像

    因为公司电脑都由管理员管控,使用自己的账号是无法执行一些需要管理员权限的命令,所以在刚到公司时,使用管理员账号安装了node,配置了node缓存目录node_cache.node_global,以及设 ...

  10. Errors报错记录

    Errors报错记录 前言 Error1 Error2 Error3 Error4 Error5 Error6 Error7 Error8 Error9 Error10 Error11 总结 前言 记 ...

最新文章

  1. Node.js 将Json文件数据转为SQL可执行的insert语句
  2. 阿里产品专家:高情商的技术人,如何做沟通?
  3. 【Python基础】Jupyter Notebook最常用的五大配置技巧
  4. [HDU3336]Count the string(KMP+DP)
  5. 公用机房计算机主板选购,才知道,IDC机房运维工作居然可以如此简单!
  6. python之socket编程
  7. sql 时间 没有日期_SQL-补充:日期和时间戳互转
  8. 得物:两款问题商品系标识标注方式不符合最新规定 已先行下架商品
  9. to_csvread_csvisnullisnanisna
  10. nginx rewrite php参数,Nginx泛域名解析及Rewrite重定向普通页面及带参数的页面
  11. mysql数据库url正确的是_下面关于连接mysql下的mydb数据库的url,编写正确的是()...
  12. 芒格推荐书单(完全版32本)
  13. Python 微信自动化工具开发系列06_根据用户信息自动回复升级版本(2022年10月可用)
  14. calloc()函数
  15. 第一周学习前端html的知识总结与感悟
  16. Node.js中的npm与包
  17. 线性回归2020年天猫双十一销量
  18. 单片机(MCU)复位电路
  19. 面试常问的PECS原则,到底是什么鬼?
  20. 20175208 实验一 Java开发环境的熟悉

热门文章

  1. html标签对应的英文原文,[转载]片尾字幕中英文对照
  2. python实现21根火柴游戏
  3. BitCoin p2p通信过程
  4. 初学者之路——————对抗神经网络
  5. 十进制转换八进制代码c语言,利用栈将十进制转换为八进制(C语言)
  6. MATLAB实现空间前方交会-后方交会计算
  7. 关于椰子汁的学问,你知道多少?
  8. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day39】—— 数据库6
  9. QWidget->isVisible属性的探究
  10. 基于大规模语料的新词发现算法