<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/mybatis-3-mapper.dtd">
<mapper namespace="cn.kolbe.mybatis.domain.UserMapper">
<insert id="getGeneratedKey1" parameterType="cn.kolbe.mybatis.domain.User">
insert into users(name, password) values(#{name}, #{password})
</insert>
<!-- useGeneratedKeys默认值为false,keyProperty的值对应的是User类中的主键名 -->
<insert id="getGeneratedKey2" parameterType="cn.kolbe.mybatis.domain.User" useGeneratedKeys="true" keyProperty="id">
insert into users(name, password) values(#{name}, #{password})
</insert>
<insert id="getGeneratedKey3" parameterType="cn.kolbe.mybatis.domain.User">
<!-- 使用这种方式要注意,resultType是要设置的,否则将抛异常,该值对应的User类中的主键类型 -->
<!-- keyProperty对应的是User类中的主键名,假设取名为user_id,则这边也要改成user_id -->
<selectKey keyProperty="id" resultType="int">
select LAST_INSERT_ID()
</selectKey>
insert into users(name, password) values(#{name}, #{password})
</insert>
</mapper>
参考:https://blog.youkuaiyun.com/happylife_haha/article/details/51993350
插入数据获取自增Id报错
nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter 'listId' not found. Available parameters are [metricDataRecoveryVo, param1]; nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter 'listId' not found. Available parameters are [metricDataRecoveryVo, param1] error
示例代码:
public void insertMetricDataRecovery(
@Param("metricDataRecoveryVo") MetricDataRecoveryVo metricDataRecoveryVo);
<insert id="insertMetricDataRecovery" parameterType="com.webank.ims.config.bean.metric.MetricDataRecoveryVo" useGeneratedKeys="true" keyProperty="listId">
insert into ims_metric_data_recovery_list(recovery_date,start_time,end_time,from_source,to_source,id_range,id_list)
values(#{metricDataRecoveryVo.recoveryDate},#{metricDataRecoveryVo.startTime},#{metricDataRecoveryVo.endTime},#{metricDataRecoveryVo.fromSource}
,#{metricDataRecoveryVo.toSource},#{metricDataRecoveryVo.idRange},#{metricDataRecoveryVo.idList})
</insert>
发现是keyPropety设置的问题。改为keyProperty="metricDataRecoveryVo.listId"就可以。我认为这和接口定义了注解有关,如果不用@Param来指定名称,可能就没有问题(待验证)。
参考:https://blog.youkuaiyun.com/yanyaming920817/article/details/50393684