背景
业务场景是这样的:在设计数据表时涉及到跨表保存数据,其中 A 表数据对应多条 B 表数据,且 A 表的自增 ID 在 B 表中为一个字段,从而实现两表的业务关系。
但由于两表的数据需要同时(业务上的同时,在代码实现上仍然是先插入 A 表数据然后再插入 B 表数据) insert 到数据库中,因此在插入 A 表数据时需要获取它的自增 ID。
实现
理论部分
在 MyBatis 的 insert 语句中,可以通过设置 useGeneratedKeys
和 keyProperty
属性来实现返回自增 ID。
useGeneratedKeys
属性设置为 true
表示使用数据库自动生成的键值,keyProperty
属性指定了将自动生成的键值设置到哪个属性中。
具体实现
在 SpringBoot 项目中,例如我们创建一个如下 Demo:
User 实体:
package com.langjialing.helloworld.model.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author 郎家岭伯爵
* @time 2023/3/13 16:07
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class UserEntity {
private Integer id;
private String userName;
private String password;
private Long age;
}
测试 Controller:
@GetMapping("/addUser")
public Integer addUser(){
UserEntity userEntity = new UserEntity().setUserName("郎家岭伯爵").setPassword("123456").setAge(18L);
userMapper.insertUser(userEntity);
return userEntity.getId();
}
Mapper.xml:(useGeneratedKeys=“true” keyProperty="id"两个属性设置实现功能)
<insert id="insertUser" parameterType="com.langjialing.helloworld.model.entity.UserEntity" useGeneratedKeys="true" keyProperty="id">
insert into `user` (user_name, password, age)
values (#{userName}, #password}, #{age})
</insert>
Postman 调用测试:
总结
在 MyBatis 的 insert 语句中,可以通过设置 useGeneratedKeys
和 keyProperty
属性来实现返回自增 ID,从而实现一些特定的业务需求。