前言

在日常业务处理中,我们难免需要立马用到刚刚插入数据库数据的id,如果我们的id并不是我们插入的(例如uuid,雪花算法得到的等),而是数据库自增的,我们便无法得知次id是多少,如果我们再次查询数据库来获取该id,属实是写复杂了,并且还再次访问了数据库,有些多此一举,但mybatis给我们提供了一种方法以便我们来获取到该id,接下来就让我们来一探究竟吧

业务复现

现在我们有一张用户表,一张角色表,一张用户角色中间表,我们需要新建用户的时候给用户赋予角色,这个时候便需要在用户表插入数据时获取到该用户的id

我们正常来写的话代码如下:

(简单复现一下代码)
实现类
 @Override
    public void insertUserDept(User user) {
        System.out.println(user);
        userMapper.insertUserDept(user);
        System.out.println(user);
        //给用户角色中间表添加角色
        insertDept(user);
    }

    private void insertDept(User user) {
        UserDept userDept = new UserDept();
        userDept.setDeptId(user.getDeptId());
        userDept.setUserId(user.getId());
        userDeptMapper.insertDept(userDept);
    }
user.xml
<insert id="insertUserDept">
        insert into user (name)
        values (#{user.name})
    </insert>
userDept.xml
<insert id="insertDept">
        insert into dept (dept_id,user_id) values (#{deptId},#{userId})
    </insert>

这样子写会有报错,提示我们userId不能为空,这就说明我们无法获取到新加入用户的id

解决方案

在user.xml加入两个参数

  • useGeneratedKeys

  • keyProperty

useGeneratedKeys:允许JDBC支持自动生成主键

keyProperty:主键字段

user.xml
<insert id="insertUserDept" useGeneratedKeys="true" keyProperty="id">
        insert into user (name)
        values (#{user.name})
    </insert>

这时,我们看到成功拿到了刚加入数据的id

注意:

如果还是没拿到,可能是yaml的mybatis配置问题,以下是我的配置

# Mybatis配置
mybatis:
  # 配置XML映射文件中指定的实体类别名路径
  type-aliases-package: com.example.demo.domain
  # 配置MyBatis的xml配置文件路径
  mapper-locations: classpath:mapper/*.xml
  # 开启驼峰userName自动映射到user_name
  map-underscore-to-camel-case: true