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

2023-07-10 10:18:15 浏览数 (2)

背景:

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

代码语言:javascript复制
Integer insertEntitySelectiveShard(@Param("tableSuffix") String tableSuffix,@Param("entity") XXXEntity entity);

对应的xml片段:

代码语言:javascript复制
<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)  

0 人点赞