mybatis insert 动态生成插入的列及批量插入值

Ai糖宝 2020年05月08日 167次浏览

mybatis insert 动态生成插入的列及批量插入值

列名跟表名,当参数传递到mybatis,用${}获取, 不再多说,这里主要说该如何批量插入值

先写一个例子:

insert into test(id, name) values(1,"1name"),(2,"2name"),(3,"3name")

思想:

  • 假设:列名是List 形式, 假设columns

列值是List<List> 形式, 假设values

  • 首先列的数量,跟一行的值的数量是相匹配的,再就是列与值在list中的顺序保持一致;

在add columns 和add values.get(i) 的时候, 要添加索引, 例如 add(1, "name");

实际项目中, 批量插入的值, 应该是 list[entity] 或list[map]形式

一、那就需要先组装数据,将值转换成list[list] 形式
/**
 * 组装数据
 *
 * @param columnDtos  所有的列
 * @param values 所有的参数
 * @param dbColumns 返回的所有列名
 * @param dbValues 返回的组装插入值
 */
private void buildDbData(
    List<ColumnDto> columnDtos,
    List<Map<String, Object>> values,
    List<String> dbColumns,
    LinkedList<LinkedList<Object>> dbValues) {
  for (int i = 0; i < columnDtos.size(); i++) {
    ColumnDto item = columnDtos.get(i);
    dbColumns.add(i, item.getColumnName());
  }

  for (Map<String, Object> map : values) {
    LinkedList<Object> list = new LinkedList<>();
    for (int i = 0; i < columnDtos.size(); i++) {
      ColumnDto columnItem = columnDtos.get(i);
      list.add(i, map.get(columnItem.getAttrName()));
    }
    dbValues.add(list);
  }
}

二、dao层

void insertApiSaveBatch(
    @Param("tableName") String tableName,
    @Param("dbColumns") List<String> dbColumns,
    @Param("dbValues") List<LinkedList<Object>> dbValues);

三、sql语句

mybatis xml:
<!--批量插入values-->
<sql id="values">
  <foreach item="item" collection="dbValues" separator="," >
    <foreach collection="item" item="detailItem" index="index" open="("
             close=")"  separator=",">
      #{detailItem}
    </foreach>
  </foreach>
</sql>

<!--批量插入-->
<insert id="insertApiSaveBatch">
  insert into ${tableName} (
  <foreach collection="dbColumns" item="columnItem" separator=",">
    ${columnItem}
  </foreach>
  )
  values <include refid="values"/>
</insert>
实体类:
import lombok.Data;

import java.io.Serializable;

/**
 * 列的属性
 *
 * @author wenbin
 * @Date 2020-05-11 11:47
 */
@Data
public class ColumnDto implements Serializable {
  // 列名类型
  private String dataType;
  // 属性名称 下划线转驼峰
  private String attrName;
  // 列名
  private String ColumnName;
  // 数据库名
  private String tableName;
  // 属性类型
  private String attrType;
  // 主键
  private String priKey;
  // 是否允许空
  private String isNullable;
}