背景:
有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)