首页 > 其他分享 >mybatis 3.x 升级时遇到的keyProperty问题小坑

mybatis 3.x 升级时遇到的keyProperty问题小坑

时间:2023-06-17 16:25:19浏览次数:53  
标签:keyProperty Param entity 报错 mybatis id 小坑

背景: 有1个项目,原来是用的mybatis 3.4.6版本,其中有一些插入mapper是这样写的:

Integer insertEntitySelectiveShard(@Param("tableSuffix") String tableSuffix,@Param("entity") XXXEntity entity);

对应的xml片段:

<insert id="insertEntitySelectiveShard" parameterType="com.cnblogs.yjmyzz.dao.entity.XXXEntity" useGeneratedKeys="true" keyProperty="id">

 可能有同学说了,按官网文档的说法,keyProperty这里写法不规范:

既然是对象的属性,正确的写法应该是 keyProperty="entity.id",但该项目id生成方式,后来改用snowflake分布式id算法,在insert前entity.id上已赋值了,也就无需mybatis在insert后自动返回,关键的是3.4.6版本,遇到这种不规范的写法,并不会报错,所以也就一直这样跑着。

当升级到3.5.13后,运行报错:

org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.executor.ExecutorException: Could not determine which parameter to assign generated keys to. Note that when there are multiple parameters, 'keyProperty' must include the parameter name (e.g. 'param.id'). Specified key properties are [id] and available parameters are [tableSuffix, param1, entity, param2]   经过实测,结论如下: 1、只有1个参数时,加不加@Param("entity") 都不会报错 2、大于1个参数时,keyProperty必须写成规范的entity.id,否则报错 3、不管是几个参数,keyColumn=“id" 始终不会报错(也建议用该方式,前提是表上的主键字段名就是id)  

标签:keyProperty,Param,entity,报错,mybatis,id,小坑
From: https://www.cnblogs.com/yjmyzz/p/mybatis_keyproperty.html

相关文章

  • 分析小数部分位数时遇到的小坑
    本篇随笔讲一下split()和split_part()1、split函数split(<str>,<pat>,[<trimTailEmpty>])参数1是一个string参数2要注意是一个正则表达式,不是string(这也是本次遇到小坑的地方)参数3不常用,true是默认值,如果解析"a,b,c,,",true时得到['a','b','c'],它会把末尾的空值剔掉,如果是false......
  • MyBatis核心配置文件
              ......
  • mybatis 笔记
    查询结果被合并mapper中定义的sql查询结果有3条,但执行mapper接口方法返回的实体列表只有1条,数据数量不符。这有可能是由于xml中的定义的resultMap有缺陷,如没有明确的定义一个用作主键的列,这分两种情况分别说明。//reusltMap定义<resultMapid="vo"type="ProjectCen......
  • MyBatis快速入门--环境搭建
     1.------------------------------CREATEdatabasemybatis;usemybatis;CREATETABLEtb_user(idINTPRIMARYKEYauto_increment,usernamevarchar(20),passwordvarchar(20),genderCHAR(1),addrvarchar(30));INSERTintotb_user(id,username,password,gen......
  • MyBatis安装&入门
    MyBatis创建在pom.xml中添加依赖<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency>&l......
  • MyBatis-Plus学习
    一、MyBatis-Plus简介1、简介MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。2、特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本CURD,性能基本无损耗,直接面向对......
  • 记一次 ESLint 格式化代码踩坑(小坑)
    背景最近在尝试使用ESLint取代Prettier来格式化代码,主要受Antfu博文:https://antfu.me/posts/why-not-prettier-zh的启发,其中提到的痛点,也确实有遇到。于是决定使用Antfu大佬提供的eslint-config配置。readme把步骤说的非常清楚,在公司一步一步配置,也没有任何问题,用起来很是......
  • Mybatis中SqlNode的组合模式
    组合( Composite )模式就是把对象组合成树形结构,以表示“部分-整体”的层次结构,用户可以像处理一个简单对象一样来处理一个复杂对象,从而使得调用者无需了解复杂元素的内部结构。组合模式中的角色有:抽象组件(容器):定义了树形结构中所有类的公共行为,例如add(),remove()等方法。树叶:最终......
  • MyBatis-Plus的BaseMapper与IService
    mybatis-plus提供两种包含预定义增删改查操作的接口:com.baomidou.mybatisplus.core.mapper.BaseMappercom.baomidou.mybatisplus.extension.service.IService刚开始有点疑惑为什么要设计俩个接口用来增删改查BaseMapper和IService的方法有很多类似的功能,但是方法名不同对比......
  • mybatisplus总结
    mybatisplus和springboot的集成导入依赖<!--spring-boot-web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dep......