mybatis报错:当要返回刚刚插入数据的id时

本文解决了一个在使用MyBatis进行数据库操作时遇到的问题:在插入数据后获取自动生成的主键ID。问题源于配置文件中未正确指定返回类型,通过明确设置resultType=int得以解决。

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

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: org.apache.ibatis.executor.ExecutorException: Error selecting key or setting result to parameter object. Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.coci.entity.addUser!selectKey'.  It's likely that neither a Result Type nor a Result Map was specified.
### The error may involve com.coci.entity.addUser!selectKey-Inline
### The error occurred while setting parameters
### Cause: org.apache.ibatis.executor.ExecutorException: Error selecting key or setting result to parameter object. Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.coci.entity.addUser!selectKey'.  It's likely that neither a Result Type nor a Result Map was specified.
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:104)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:91)
at com.coci.test.Test1.addUser(Test1.java:98)
at com.coci.test.Test1.main(Test1.java:24)
Caused by: org.apache.ibatis.executor.ExecutorException: Error selecting key or setting result to parameter object. Cause: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.coci.entity.addUser!selectKey'.  It's likely that neither a Result Type nor a Result Map was specified.
at org.apache.ibatis.executor.keygen.SelectKeyGenerator.processGeneratedKeys(SelectKeyGenerator.java:60)
at org.apache.ibatis.executor.keygen.SelectKeyGenerator.processAfter(SelectKeyGenerator.java:32)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:26)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:51)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:29)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:73)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:43)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:102)
... 3 more
Caused by: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'com.coci.entity.addUser!selectKey'.  It's likely that neither a Result Type nor a Result Map was specified.
at org.apache.ibatis.executor.resultset.FastResultSetHandler.validateResultMapsCount(FastResultSetHandler.java:111)
at org.apache.ibatis.executor.resultset.FastResultSetHandler.handleResultSets(FastResultSetHandler.java:95)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:40)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:55)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:41)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:95)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:72)
at org.apache.ibatis.executor.keygen.SelectKeyGenerator.processGeneratedKeys(SelectKeyGenerator.java:50)

... 10 more



原因:

在mybatis的mapper配置中,在插入一条数据之后,要返回刚刚插入这条数据的ID,这里必须要设置id的返回类型( resultType="int"),否则会报以上的错误

<insert id="addUser" parameterType="com.coci.entity.User">
	
		<selectKey order="AFTER" keyProperty="uid" resultType="int">

			select LAST_INSERT_ID()
		</selectKey>
		insert into user(uname,uage) values(#{uname},#{uage})
</insert>


<think>好的,我现在需要解决用户的问题:使用MyBatis插入数据返回ID,但数据库中查询不到记录。首先,我得梳理可能的原因,并根据提供的引用资料和常见问题来分析。 用户提到插入操作代码没有报错,但数据库中没有数据返回ID可能有问题。根据引用内容,有几个可能的方向: 1. **事务未提交**:MyBatis默认可能不会自动提交事务,特别是如果使用Spring管理事务的话,可能需要检查是否在插入后没有提交事务,导致数据未持久化。例如,如果手动管理事务,可能需要显式调用commit()。 2. **主键配置错误**:根据引用[2]和[4],如果XML中没有正确配置返回主键ID,可能导致获取的ID不正确或者未实际插入。例如,使用useGeneratedKeys或selectKey标签是否正确设置,特别是数据库是否支持自增主键,或者是否在插入后正确映射到对象中。 3. **数据库连接或回滚问题**:可能在插入过程中发生了异常,导致事务回滚,但代码没有捕获到异常,所以用户以为成功,但实际被回滚了。需要检查是否有异常处理遗漏,或者日志中有无隐藏的错误。 4. **字段长度或约束问题**:引用[1]提到数据可能超出字段长度或违反数据库约束(如唯一性、非空等),导致插入失败,但程序没有抛出错误。例如,某些数据库驱动可能不会在插入立即报错,而是在提交才会报错,这需要检查日志或数据库的约束条件。 5. **数据库名或表名使用关键字**:引用[1]提到数据库或表名可能是MySQL的关键字,需要检查表结构和命名是否有问题,是否需要用反引号包裹。 6. **自增ID的获取机**:根据引用[3],如果使用拼接SQL或者非标准方式插入,可能需要特别注意获取自增ID的方式是否正确,例如是否在插入后立即获取,或者是否在批量插入处理得当。 接下来,需要结合这些可能性,逐步给出解决方案。例如,首先检查事务是否提交,然后查看MyBatis的配置是否正确,接着检查数据库的约束和字段是否匹配,最后验证是否有隐藏的错误或异常。 用户希望得到结构清晰的解决方案,所以需要分步骤说明,并且引用相关资料中的解决方法。例如,引用[2]提到需要配置useGeneratedKeys和keyProperty,引用[4]指出需要确保在插入后正确获取ID,可能需要在Service层打印或返回对象查看。 同,需要注意中文回答,确保LaTeX格式正确,行内公式用$...$,独立公式用$$...$$。不过在这个问题中可能涉及较少的数学公式,但如果有需要的地方,比如解释主键生成算法,可能需要使用。 最后,生成相关问题,例如事务管理、主键配置、日志调试等,帮助用户深入理解问题。</think>### MyBatis插入数据返回ID数据库无记录的解决方案 #### 1. 检查事务提交状态 MyBatis默认不会自动提交事务(取决于配置)。若未显式提交或未启用自动提交,数据不会持久化到数据库。 - **手动管理事务**:调用`sqlSession.commit()`提交事务[^1]。 - **Spring事务管理**:确保插入方法标注了`@Transactional`注解,且未设置`readOnly=true`。 #### 2. 验证主键返回配置 确保XML映射文件正确配置了主键返回: ```xml <insert id="insert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO table (column) VALUES (#{value}) </insert> ``` - `useGeneratedKeys`:声明使用数据库自增主键。 - `keyProperty`:指定实体类中接收主键的字段。插入后可通过`对象.getId()`获取[^2][^4]。 #### 3. 排查数据库约束与字段问题 - **字段长度限制**:检查插入数据是否超出字段定义长度(如`VARCHAR(255)`)。 - **唯一性约束**:若主键或唯一索引冲突,插入会静默失败(需查看数据库日志)。 - **表名/字段名关键字冲突**:将表名或字段用反引号包裹,如`` `order` ``[^1]。 #### 4. 确认数据库连接与回滚 - **异常回滚**:插入操作若抛出未捕获的异常,事务会自动回滚。需检查日志是否有隐藏错误。 - **连接池配置**:确保数据库连接有效,未因超断开。 #### 5. 验证自增ID获取逻辑 - **批量插入场景**:需使用`<selectKey>`标签或特殊语法(如MySQL的`LAST_INSERT_ID()`)批量返回ID[^3]。 - **对象映射验证**:插入后打印对象ID,确认是否成功赋值: ```java setmealMapper.insert(dto); System.out.println("Generated ID: " + dto.getId()); // 检查控制台输出 ``` #### 6. 启用MyBatis日志调试 在配置文件中开启SQL日志,观察实际执行的语句和参数: ```properties # application.properties logging.level.org.mybatis=DEBUG ``` 通过日志可确认: - SQL是否包含错误(如语法错误或参数绑定失败)。 - 事务是否正常提交。 --- ### 相关问题 1. **如何配置MyBatis批量插入返回自增ID?** 2. **Spring事务管理不生效的常见原因有哪些?** 3. **MyBatis执行插入操作如何捕获数据库异常?** 4. **MySQL中`LAST_INSERT_ID()`的工作原理是什么?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值