MyBatis 注解方式批量插入数据

193 阅读1分钟

项目中使用的注解方式,而不是原先的xml,批量插入有些区别,封装个类记录下

BatchInsertModel

批量插入模型类

import java.util.List;

public class BatchInsertModel<T> {
  private final String modelName; // 表名
  private final List<String> columns; // 要插入的字段顺序
  private final List<T> list; // 实际要插入的数据

  public BatchInsertModel() {
    this.modelName = null;
    this.columns = null;
    this.list = null;
  }

  public BatchInsertModel(String modelName, List<String> columns, List<T> list) {
    this.modelName = modelName;
    this.columns = columns;
    this.list = list;
  }

  public String getModelName() {
    return modelName;
  }

  public String getColumnStr() {
    if (columns == null) {
      return "";
    }
    return String.join(",", columns);
  }

  public List<String> getColumns() {
    return columns;
  }

  public List<T> getList() {
    return list;
  }

  public int getSize() {
    return list == null ? 0 : list.size();
  }

  public String batchInsert(BatchInsertModel<T> batchInsertModel) {
    StringBuilder sb = new StringBuilder();
    sb.append("INSERT INTO ").append(batchInsertModel.getModelName())
            .append(" (").append(batchInsertModel.getColumnStr()).append(") VALUES ");
    List<String> columns = batchInsertModel.getColumns();
    int size = columns.size();
    int size1 = batchInsertModel.getSize();
    for (int i = 0; i < size1; i++) {
      getInsertSQL(i, size, columns, sb);
      if (i < size1 - 1) {
        sb.append(", ");
      }
    }
    return sb.toString();
  }

  private void getInsertSQL(int index, int size, List<String> columns, StringBuilder sb) {
    sb.append("(");
    for (int i = 0; i < size; i++) {
      String s = columns.get(i);
      sb.append("#{list[").append(index).append("].").append(s).append("}");
      if (i < size-1) {
        sb.append(", ");
      }
    }
    sb.append(")");
  }
}

UserBatchMapper

@Repository
public interface UserBatchMapper {
    
    @InsertProvider(type = BatchInsertModel.class, method = "batchInsert")
    int batchInsert(BatchInsertModel<User> batchInsertModel);
}

Test

@SpringBootTest
public class BatchTests {
 
  @Autowired
  private UserBatchMapper userBatchMapper;

  @Test
  void batchInsertTests() {
    List<User> users = new ArrayList<>();
    // 因为id是在new对象的时候就生成了,所以不需要手动指定
    User e = new User();
    e.setName("a1");
    users.add(e);

    User e2 = new User();
    e2.setName("a2");
    users.add(e2);

    User e3 = new User();
    e3.setName("a3");
    users.add(e3);
    BatchInsertModel<User> batchInsertModel = new BatchInsertModel<>("t_User", Arrays.asList("id", "name"),
            users);
    int i = userBatchMapper.batchInsert(batchInsertModel);
    System.out.println("insert: " + i);
  }
}