Mybatis插入返回自增主键报错

探讨使用MyBatis进行数据库插入操作时,如何正确配置返回生成的主键,避免因参数设置不当导致的错误,并给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

执行mybatis插入,配置返回主键如下:

@Insert("insert urun_plan.spider_record (id,taskid,starttime,endtime,receiver,spiderstatus,remarks,timestamp) value(#{record.id},#{record.taskid},#{record.starttime},#{record.endtime},#{record.receiver},#{record.spiderstatus,typeHandler=org.apache.ibatis.type.EnumTypeHandler},#{record.remarks},#{record.timestamp})")
    @Options(useGeneratedKeys=true, keyProperty="id",keyColumn="id"  )
    public int saveSpiderRecord(@Param("record")TaskRecord record);

总是报错:

`Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [record, param1]` ` Parameter 'id' not found. Available parameters are [record, param1]`

解决办法:

@Options(useGeneratedKeys=true, keyProperty="id",keyColumn="id" )中keyProperty=”id”,换成keyProperty="record.id"则一切正常。因为本方法中,参数并不是直接用字段或者Map作为载体,而是对象,所以找不到id就是必然。

 

<think>好的,我现在需要帮助用户解决在使用MyBatis插入数据后获取自主键值的问题。用户提到遇到了“Error getting generated key or setting result to parameter object”的错误,所以需要找到正确配置方法并排除问题。 首先,根据用户提供的引用内容,特别是引用[2]和[3],MyBatis通过KeyGenerator来处理主键生成。对于MySQL这样的支持自主键的数据库,可以使用Jdbc3KeyGenerator,它利用了JDBC的getGeneratedKeys方法。用户需要配置useGeneratedKeys和keyProperty属性。 接下来,我需要确保用户正确配置了这两个属性。在XML映射文件中,insert标签需要设置useGeneratedKeys="true"和keyProperty="id",其中id是实体类中对应的属性名。同时,检查数据库表的主键是否确实设置为自,比如MySQL的AUTO_INCREMENT。 然后,用户可能在批量插入时遇到了问题,如引用[4]和[5]提到的错误。需要确认批量操作是否支持获取每个记录的主键。在MyBatis中,批量插入通常使用foreach标签,但需要确保每个插入语句都能正确返回主键。此外,数据库驱动版本是否兼容,比如MySQL Connector/J的版本是否支持getGeneratedKeys方法。 还需要检查实体类是否有正确的setter方法,特别是keyProperty指定的属性。如果属性名不匹配或者没有setter方法,会导致赋值失败,从而报错。 最后,可能需要引导用户检查日志,确认错误堆栈,以排除其他潜在问题,比如数据库连接问题或字段类型不匹配等。总结步骤后,给出示例代码和常见问题解决方法,帮助用户一步步排查和解决问题。</think>在MyBatis中获取自主键值需要通过以下配置实现,以下分步骤说明: ### 一、核心配置步骤 1. **XML映射文件配置** ```xml <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name,age) VALUES(#{name},#{age}) </insert> ``` - `useGeneratedKeys="true"`:启用JDBC的getGeneratedKeys方法获取主键[^2] - `keyProperty="id"`:将生成的主键值注入到参数对象的id属性中[^3] 2. **实体类字段匹配** ```java public class User { private Integer id; // 必须与keyProperty值匹配 private String name; private Integer age; // 必须有setter方法 } ``` ### 二、执行验证 ```java User user = new User(); user.setName("张三"); user.setAge(25); mapper.insertUser(user); System.out.println(user.getId()); // 输出自主键值 ``` ### 三、批量插入特殊处理 批量插入时需要确保数据库驱动支持批量获取自主键(MySQL Connector/J 5.1.40+): ```xml <insert id="batchInsert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name,age) VALUES <foreach collection="list" item="item" separator=","> (#{item.name},#{item.age}) </foreach> </insert> ``` ### 四、常见错误解决方案 | 错误现象 | 原因分析 | 解决方案 | |---------|----------|---------| | Error getting generated key[^4] | 字段类型不匹配/缺少setter方法 | 检查POJO字段类型与数据库一致 | | 返回null值 | keyProperty配置错误 | 确认keyProperty与POJO字段名一致 | | 批量插入主键重复 | 批量模式下主键生成策略冲突 | 确保使用数据库自而非程序生成 | ### 五、数据库层面验证 确认MySQL表结构包含自主键: ```sql CREATE TABLE user( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), age INT ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值