Mybatis:批量插入数据

郎家岭伯爵 2023年01月28日 270次浏览

背景

使用 Mybatis 向数据库中批量插入数据。

实现

实体类

例如需要在数据库中批量插入如下实体类:

package com.langjialing.springbootpagehelperdemo.entity;

import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

/**
 * <p>
 * 用户表
 * </p>
 *
 * @author 郎家岭伯爵
 * @since 2023-01-11
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(value="User对象", description="用户表")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "用户ID")
    private Integer userId;

    @ApiModelProperty(value = "用户名")
    private String userName;

    @ApiModelProperty(value = "用户密码")
    private String password;

}

Service层

Service接口写法

不同于单条数据,插入多条数据时需要把参数定义为 List 类型

Boolean addUsers(List<User> users);

Service接口实现类

@Override
public Boolean addUsers(List<User> users) {
    return userMapper.addUsers(users);
}

Controller层

Controller 层同样需要把参数定义为 List 类型:

@ApiOperation("批量增加用户")
@PostMapping("/addUsers")
public Boolean addUsers(@RequestBody @Validated List<User> users){
    return userService.addUsers(users);
}

Mapper类

Boolean addUsers(List<User> users);

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.langjialing.springbootpagehelperdemo.mapper.UserMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.langjialing.springbootpagehelperdemo.entity.User">
        <result column="user_name" property="userName" />
        <result column="password" property="password" />
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        user_id, user_name, password
    </sql>
    
    <insert id="addUsers"
            parameterType="com.langjialing.springbootpagehelperdemo.entity.User">
        insert into `user` (user_name, password)
        values
               <foreach collection="users" item="item" separator=",">
                   (#{item.userName}, #{item.password})
               </foreach>
    </insert>

</mapper>

总结

对比于单条数据,使用 Mybatis 批量操作数据时,只需要把各层级中的参数修改为 List 类型,同时在 Mapper.xml 使用 foreach 语法即可。其它均是一样的。

赞助页面示例