JAVA在插入自增主键的一条数据,如何同时获取该条自增的主键id?
业务场景
开发业务场景:在学生管理系统业务场景中,比如班上新来一名转校学生小吴,并参与了此次学校的摸底考试,那么系统管理员需要将他的信息更新到学生表的同时还需要和课程表绑定关系(多对多关系中需建立一个关系表)。成绩表(主要字段:student_id, sourse_id, score …)通过学生id和课程id来确定一条数据的唯一性。 所以在添加一名新学生的时候,相关的关系表也要做添加操作(小吴学了哪些课程)。
实际开发举例:
@Service
public class GroupServiceImpl implements IGroupService
{
private static final Logger log = LoggerFactory.getLogger(GroupServiceImpl.class);
@Autowired
private GroupMapper groupMapper;
@Autowired
private IGroupUserService groupUserService;
/*
业务场景:group(分组表),user(用户表),分组用户关系表(group_user)
添加一个新的分组,分组下面可以有多个成员,一个成员可以创建多个分组,它们之间是多对多的关系,在添加一个新分组的时候,关系表也要绑定这条添加记录。因此此处有两个insert操作。新建分组是必须由当前user来新建的。所以新建的分组的时候,就得往group_user关系里填一条默认记录。
*/
@Override
public int insertGroupInfo(Group group) {
BeanUtils.initInsertProperty(group);//初始化一些字段
groupMapper.insertSelective(group);//添加分组
groupUserService.insertGroupUserSelective. (newGroupUser(0,group.getId(),SecurityUtils.getLoginUser().getUser().getUserId().intValue(),SecurityUtils.getLoginUser().getUser().getRoleId().intValue(),Constants.TEAM_ROLE.LEADER));//默认添加分组成员关系表一条记录(创建分组者)
return 1;
}
}
代码实现
这里我们会使用mysql技术,在XXXXXmapper.xml文件中,在insert 代码位置添加如下属性:useGeneratedKeys=“true” 和 keyProperty=“id”,此处的id即为你设置的自增的主键字段
<insert id="insert" parameterType="com.demo.project.entity.Student" useGeneratedKeys="true" keyProperty="id">
insert into student (id, name,sex,age)
values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{sex,jdbcType=VARCHAR}, #{age,jdbcType=VARCHAR}
</insert>
在mapper映射文件添加好属性后便可在service层直接获取id
Student student=new Student();
student.setName("小吴");
studentService.insertStudent(student);//添加学生
ScoreService.insertScore(new Score(student.getId(),sourse.getId,0));//添加成绩实体,成绩默认为0分
总结
获取当前添加的数据字段自增id的值,使用mysql技术,在insert操作的时候,添加关键属性:
1. useGeneratedKeys=“true”
2. keyProperty=“id”
3. 直接在service层获取当前添加实体的id。
4. mybatisplus 默认集成了useGeneratedKeys=“true” 和 keyProperty=“id” 属性,可以直接通过getId()获取。