前言

在日常业务处理中,我们难免需要立马用到刚刚插入数据库数据的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);
    }
<pre><code>private void insertDept(User user) {
    UserDept userDept = new UserDept();
    userDept.setDeptId(user.getDeptId());
    userDept.setUserId(user.getId());
    userDeptMapper.insertDept(userDept);
}</code></pre><h6 style="" id="user.xml">user.xml</h6><pre><code class="language-xml">&lt;insert id="insertUserDept"&gt;
    insert into user (name)
    values (#{user.name})
&lt;/insert&gt;</code></pre><h6 style="" id="userdept.xml">userDept.xml</h6><pre><code class="language-xml">&lt;insert id="insertDept"&gt;
    insert into dept (dept_id,user_id) values (#{deptId},#{userId})
&lt;/insert&gt;</code></pre><p style=""></p><p style="">这样子写会有报错,提示我们userId不能为空,这就说明我们无法获取到新加入用户的id</p><p style=""><img src="/upload/image-debh.png" width="100%" height="100%" style="display: inline-block"></p><h1 style="" id="%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">解决方案</h1><p style="">在user.xml加入两个参数</p><ul><li><p style="">useGeneratedKeys</p></li><li><p style="">keyProperty</p></li></ul><p style="">useGeneratedKeys:允许JDBC支持自动生成主键</p><p style="">keyProperty:主键字段</p><h6 style="" id="user.xml-1">user.xml</h6><pre><code class="language-xml">&lt;insert id="insertUserDept" useGeneratedKeys="true" keyProperty="id"&gt;
    insert into user (name)
    values (#{user.name})
&lt;/insert&gt;</code></pre><p style=""><img src="/upload/image-ykkl.png" width="100%" height="100%" style="display: inline-block"></p><p style="">这时,我们看到成功拿到了刚加入数据的id</p><h4 style="" id="%E6%B3%A8%E6%84%8F%3A">注意:</h4><p style="">如果还是没拿到,可能是yaml的mybatis配置问题,以下是我的配置</p><pre><code class="language-yaml"># 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