项目中使用的注解方式,而不是原先的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);
}
}