mybatis插入操作后返回自增id,映射到对象中

Posted Tchou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis插入操作后返回自增id,映射到对象中相关的知识,希望对你有一定的参考价值。

问题描述

上次面试中被问到Mybatis中使用insert后返回自增id怎么操作,当时只知道可以返回被修改的行数,并不知道可以将插入/修改的内容的主键id映射到使用的对象中,后续查阅资料才知道有这样的功能。。

方法有两种 xml/注解

User.java:

public class User {
    private int id;
    private String userName;
    private String password;
    private String realName;

    // Getter & Setter
}

XML方式

mapper内容:

public interface UserMapper {
    void insertAll(User user);

    void insertBatch(List<User> users);
}

在classpath下mapper文件夹内的UserMapper.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.tz.mapper.UserMapper">
    <insert id="insertAll" useGeneratedKeys="true" keyProperty="id" keyColumn="id" parameterType="com.tz.model.User">
        insert into `user1`(userName, password, realName)
        values (#{userName}, #{password}, #{realName})
    </insert>

    <insert id="insertBatch" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        insert into `user1`(userName, password, realName)
        values
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.userName}, #{item.password}, #{item.realName})
        </foreach>
    </insert>
</mapper>

上述两种形式:单个插入、批量插入都能插入成功并且将插入的主键id映射到对象User中,这样我们就可以使用插入的主键id进行redis缓存存储之类的操作了。

  • 当然要注意一些细节,如果在mapper中加入了@Param注解(最好还是别加):
@param is a special format comment used by javadoc to generate documentation. 
it is used to denote a description of the parameter (or parameters) a method can receive

要加@Param注解的话需要额外修改xml中的配置(collection)(原本collection不加@Param注解的时候是list array map三种类型):

void insertBatch(@Param("users") List<User> users);
<insert id="insertBatch" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
      insert into `user1`(userName, password, realName)
      values
      <foreach collection="users" item="item" index="index" separator=",">
            (#{item.userName}, #{item.password}, #{item.realName})
      </foreach>
</insert>

这种方法可以完成插入数据,但是并没有任何返回值映射到我们使用的实例中(以前是什么,现在就是什么)

  • 所以建议在xml方式中还是别使用@Param (如果可以使用并且完成以上操作的话欢迎指正)

注解方式(Annotation)

  • 使用注解就看起来比较清楚了,其中Options是完成自增主键id返回值映射到实例中的作用。
  • 和xml方式一样,不要使用@Param注解来更换内部变量的变量名,否则不能返回主键id。
  • 批量插入的Insert和xml类似,只是把xml中写到了@Insert的value中来。
public interface UserMapper {
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    @Insert("insert into `user1`(userName, password, realName) " +
            "values(#{userName}, #{password}, #{realName}) ")
    void insert(User user);

    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    @Insert({
            "<script>" +
            "insert into `user1`(userName, password, realName)" +
            "values" +
            "<foreach collection=‘list‘ item=‘item‘ index=‘index‘ separator=‘,‘>" +
            "(#{item.userName}, #{item.password}, #{item.realName})" +
            "</foreach>" +
            "</script>"
    })
    void insertBatchByAnnotation(List<User> users); // 可以使用int返回值,返回的是操作影响的表内行数
}

以上是关于mybatis插入操作后返回自增id,映射到对象中的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis基于注解数据库插入记录后返回自增编号

使用mybatis插入自增主键ID的数据后返回自增的ID

mybatis插入数据后返回自增的主键id

mybatis插入insert操作,返回自增id

mybatis插入insert操作,返回自增id

mybatis插入操作时,返回自增主键id