检查代码后没发现mapper文件设置自增主键返回的问题,后来检查到,关闭事务后,执行完是可以获取返回的主键的,
我在mysql的客户端里关闭自动提交,发现使用select last_insert_id() 也是可以正确获取最新主键的, 我意识到可能是mybatis配置的问题。
问同事后发现了问题,将 defaultExecutorType 从 BATCH 改为 SIMPLE 即可。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 <configuration> 7 8 <settings> 9 <!-- 全局映射器启用缓存 --> 10 <setting name="cacheEnabled" value="true" /> 11 <!-- 查询时,关闭关联对象即时加载以提高性能 --> 12 <setting name="lazyLoadingEnabled" value="true" /> 13 <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 --> 14 <setting name="aggressiveLazyLoading" value="false" /> 15 <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 --> 16 <setting name="multipleResultSetsEnabled" value="true" /> 17 <!-- 允许使用列标签代替列名 --> 18 <setting name="useColumnLabel" value="true" /> 19 <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 --> 20 <setting name="useGeneratedKeys" value="true" /> 21 <!-- 给予被嵌套的resultMap以字段-属性的映射支持 --> 22 <setting name="autoMappingBehavior" value="FULL" /> 23 <!-- 对于批量更新操作缓存SQL以提高性能 --> 24 <setting name="defaultExecutorType" value="SIMPLE" /> 25 <!-- 数据库超过60秒仍未响应则超时 --> 26 <setting name="defaultStatementTimeout" value="60" /> 27 <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER --> 28 <setting name="jdbcTypeForNull" value="NULL" /> 29 </settings> 30 31 32 <!-- 全局别名设置,在映射文件中只需写别名,而不必写出整个类路径 --> 33 <typeAliases> 34 </typeAliases> 35 <!-- <plugins> <plugin interceptor="com.c.common.ext.mybatis.PaginationInterceptor"> 36 <property name="dialectName" value="oracle"/> </plugin> </plugins> --> 37 <!-- 非注解的sql映射文件配置,如果使用mybatis注解,该mapper无需配置,但是如果mybatis注解中包含@resultMap注解,则mapper必须配置,给resultMap注解使用 --> 38 <mappers> 39 </mappers> 40 41 </configuration>
<!-- 对于批量更新操作缓存SQL以提高性能 --> <setting name="defaultExecutorType" value="SIMPLE" />