我遇到这个问题的法伤原因比较蠢,查阅了网上相关经验都没有能够解决。看看这个经验能否帮助到你。
问题描述:
设置了属性的自增后想通过getGenerateKeys获得MySQL对应表单中自增主键id,检查了类、映射器、xml都没有发现问题,但是进行单元测试的时候始终无法获得自增的id。控制台打印的id始终是0。
先说结论:
mapper对方法的调用一定要在获取主键之前,不然相当于还没开始进行自增,id自然就没有改变。
数据库表sql如下:
create table articleinfo(
id int primary key auto_increment,
title varchar(100) not null,
content text not null,
createtime datetime default now(),
updatetime datetime default now(),
uid int not null,
rcount int not null default 1,
`state` int default 1
)default charset 'utf8mb4';
文章类代码如下,设置了几个属性
@Data
public class ArticleInfo {
private int id;
private String title;
private String content;
private Date createtime;
private Date updatetime;
private Integer uid;
}
映射器接口代码如下,设置了一个insert方法:
@Mapper
public interface ArticleInfoMapper {
public int addGetId(ArticleInfo articleInfo);
}
对应的xml中配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.testmybatis.mapper.ArticleInfoMapper">
<insert id="addGetId" useGeneratedKeys="true" keyProperty="id" >
insert into articleinfo(title,content,uid)
values(#{title},#{content},#{uid});
</insert>
</mapper>
测试代码如下:
@SpringBootTest
class ArticleInfoMapperTest {
@Autowired
private ArticleInfoMapper mapper;
@Test
void addGetId() {
ArticleInfo articleInfo = new ArticleInfo();
articleInfo.setContent("尝试获取keyProperty");
articleInfo.setUid(1);
articleInfo.setTitle("The Title");
System.out.println(articleInfo.getId() + " | " + mapper.addGetId(articleInfo));
}
}
执行测试代码后,在MySQL中查表发现数据已经添加进去了,自增主键也是成功设置:
但是控制台打印异常,显示getId的值始终为0!
debug发现执行完最后一局sout代码后,articleInfo对象的id已经是改变了的!但是打印不出相应的结果,所以问题并不出在配置上,而是出现在getId上。
再查看我才意识到,我把getId写在了mapper调用方法之前!这意味着方法还没开始我就先打印了...确实是个比较愚蠢的问题。
修改代码顺序后,程序运行成功获得预期结果..