mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 00:58:24 +08:00
feat: add insertBatchSelective in mapper and optimize insertBatch() method
This commit is contained in:
parent
cd2d515ffd
commit
da58d18007
@ -27,6 +27,7 @@ import com.mybatisflex.core.query.Join;
|
|||||||
import com.mybatisflex.core.query.QueryColumn;
|
import com.mybatisflex.core.query.QueryColumn;
|
||||||
import com.mybatisflex.core.query.QueryCondition;
|
import com.mybatisflex.core.query.QueryCondition;
|
||||||
import com.mybatisflex.core.query.QueryWrapper;
|
import com.mybatisflex.core.query.QueryWrapper;
|
||||||
|
import com.mybatisflex.core.row.Db;
|
||||||
import com.mybatisflex.core.row.Row;
|
import com.mybatisflex.core.row.Row;
|
||||||
import com.mybatisflex.core.table.TableInfo;
|
import com.mybatisflex.core.table.TableInfo;
|
||||||
import com.mybatisflex.core.table.TableInfoFactory;
|
import com.mybatisflex.core.table.TableInfoFactory;
|
||||||
@ -51,6 +52,7 @@ import java.util.Collection;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import static com.mybatisflex.core.query.QueryMethods.count;
|
import static com.mybatisflex.core.query.QueryMethods.count;
|
||||||
@ -149,7 +151,7 @@ public interface BaseMapper<T> {
|
|||||||
* @see com.mybatisflex.core.FlexConsts#METHOD_INSERT_BATCH
|
* @see com.mybatisflex.core.FlexConsts#METHOD_INSERT_BATCH
|
||||||
*/
|
*/
|
||||||
@InsertProvider(type = EntitySqlProvider.class, method = FlexConsts.METHOD_INSERT_BATCH)
|
@InsertProvider(type = EntitySqlProvider.class, method = FlexConsts.METHOD_INSERT_BATCH)
|
||||||
int insertBatch(@Param(FlexConsts.ENTITIES) List<T> entities);
|
int insertBatch(@Param(FlexConsts.ENTITIES) Collection<T> entities);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量插入实体类数据,按 size 切分。
|
* 批量插入实体类数据,按 size 切分。
|
||||||
@ -158,7 +160,7 @@ public interface BaseMapper<T> {
|
|||||||
* @param size 切分大小
|
* @param size 切分大小
|
||||||
* @return 受影响的行数
|
* @return 受影响的行数
|
||||||
*/
|
*/
|
||||||
default int insertBatch(List<T> entities, int size) {
|
default int insertBatch(Collection<T> entities, int size) {
|
||||||
|
|
||||||
// 让 insertBatch(List<T> entities, int size) 和 insertBatch(List<T> entities) 保持一样的验证行为
|
// 让 insertBatch(List<T> entities, int size) 和 insertBatch(List<T> entities) 保持一样的验证行为
|
||||||
// https://gitee.com/mybatis-flex/mybatis-flex/issues/I9EGWA
|
// https://gitee.com/mybatis-flex/mybatis-flex/issues/I9EGWA
|
||||||
@ -167,16 +169,57 @@ public interface BaseMapper<T> {
|
|||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
size = DEFAULT_BATCH_SIZE;
|
size = DEFAULT_BATCH_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<T> entityList = entities instanceof List ? (List<T>) entities : new ArrayList<>(entities);
|
||||||
|
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
int entitiesSize = entities.size();
|
int entitiesSize = entities.size();
|
||||||
int maxIndex = entitiesSize / size + (entitiesSize % size == 0 ? 0 : 1);
|
int maxIndex = entitiesSize / size + (entitiesSize % size == 0 ? 0 : 1);
|
||||||
for (int i = 0; i < maxIndex; i++) {
|
for (int i = 0; i < maxIndex; i++) {
|
||||||
List<T> list = entities.subList(i * size, Math.min(i * size + size, entitiesSize));
|
List<T> list = entityList.subList(i * size, Math.min(i * size + size, entitiesSize));
|
||||||
sum += insertBatch(list);
|
sum += insertBatch(list);
|
||||||
}
|
}
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量插入实体类数据,并自动忽略 null 值
|
||||||
|
*
|
||||||
|
* @param entities 插入的数据列表
|
||||||
|
* @return 受影响的行数
|
||||||
|
*/
|
||||||
|
default int insertBatchSelective(Collection<T> entities) {
|
||||||
|
return insertBatchSelective(entities, DEFAULT_BATCH_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量插入实体类数据,按 size 切分,并自动忽略 null 值
|
||||||
|
*
|
||||||
|
* @param entities 插入的数据列表
|
||||||
|
* @param size 切分大小
|
||||||
|
* @return 受影响的行数
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
default int insertBatchSelective(Collection<T> entities, int size) {
|
||||||
|
|
||||||
|
FlexAssert.notEmpty(entities, "entities");
|
||||||
|
|
||||||
|
if (size <= 0) {
|
||||||
|
size = DEFAULT_BATCH_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Class aClass = this.getClass();
|
||||||
|
int[] batchResults = Db.executeBatch(entities, size, aClass, (BiConsumer<BaseMapper, T>) BaseMapper::insertSelective);
|
||||||
|
int result = 0;
|
||||||
|
for (int anInt : batchResults) {
|
||||||
|
if (anInt > 0) result += anInt;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都不会忽略 {@code null} 值。
|
* 插入或者更新,若主键有值,则更新,若没有主键值,则插入,插入或者更新都不会忽略 {@code null} 值。
|
||||||
*
|
*
|
||||||
@ -257,15 +300,16 @@ public interface BaseMapper<T> {
|
|||||||
* @return 受影响的行数
|
* @return 受影响的行数
|
||||||
* @see com.mybatisflex.core.provider.EntitySqlProvider#deleteBatchByIds(Map, ProviderContext)
|
* @see com.mybatisflex.core.provider.EntitySqlProvider#deleteBatchByIds(Map, ProviderContext)
|
||||||
*/
|
*/
|
||||||
default int deleteBatchByIds(List<? extends Serializable> ids, int size) {
|
default int deleteBatchByIds(Collection<? extends Serializable> ids, int size) {
|
||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
size = DEFAULT_BATCH_SIZE;
|
size = DEFAULT_BATCH_SIZE;
|
||||||
}
|
}
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
int entitiesSize = ids.size();
|
int entitiesSize = ids.size();
|
||||||
int maxIndex = entitiesSize / size + (entitiesSize % size == 0 ? 0 : 1);
|
int maxIndex = entitiesSize / size + (entitiesSize % size == 0 ? 0 : 1);
|
||||||
|
List<? extends Serializable> idList = ids instanceof List ? (List<? extends Serializable>) ids : new ArrayList<>(ids);
|
||||||
for (int i = 0; i < maxIndex; i++) {
|
for (int i = 0; i < maxIndex; i++) {
|
||||||
List<? extends Serializable> list = ids.subList(i * size, Math.min(i * size + size, entitiesSize));
|
List<? extends Serializable> list = idList.subList(i * size, Math.min(i * size + size, entitiesSize));
|
||||||
sum += deleteBatchByIds(list);
|
sum += deleteBatchByIds(list);
|
||||||
}
|
}
|
||||||
return sum;
|
return sum;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user