一、場景
- Myabtis Plus預設沒有內建全字段更新,不滿足将字段值設定為null的需求
- 單條SQL批量插入,内置saveBatch方法是多條insert語句,批量送出,效率低
二、優化
2.1 擴充mapper層
public interface CommonMapper<T> extends BaseMapper<T> {
/**
* 全量插入,等價于insert
* {@link InsertBatchSomeColumn}
*
* @param entityList
* @return
*/
int insertBatchSomeColumn(List<T> entityList);
/**
* 全量更新,不忽略null字段,等價于update
* 解決mybatis-plus會自動忽略null字段不更新
* {@link com.baomidou.mybatisplus.extension.injector.methods.additional.AlwaysUpdateSomeColumnById}
*
* @param entity
* @return
*/
int alwaysUpdateSomeColumnById(@Param(Constants.ENTITY) T entity);
/**
* 根據 id 邏輯删除資料,并帶字段填充功能
* <p>注意入參是 entity !!! ,如果字段沒有自動填充,就隻是單純的邏輯删除</p>
* {@link LogicDeleteByIdWithFill}
*
* @param entity
* @return
*/
int deleteByIdWithFill(T entity);
}
2.2 擴充service層
public class BaseServiceImpl<M extends CommonMapper<T>, T> extends ServiceImpl<M, T> {
private static final int BATCH_SIZE = 1000;
@Transactional(rollbackFor = Exception.class)
public boolean fastSaveBatch(List<T> list, int batchSize) {
if(CollectionUtils.isEmpty(list)) {
return true;
}
batchSize = batchSize < 1 ? BATCH_SIZE : batchSize;
if(list.size() <= batchSize) {
return retBool(baseMapper.insertBatchSomeColumn(list));
}
for (int fromIdx = 0 , endIdx = batchSize ; ; fromIdx += batchSize, endIdx += batchSize) {
if(endIdx > list.size()) {
endIdx = list.size();
}
baseMapper.insertBatchSomeColumn(list.subList(fromIdx, endIdx));
if(endIdx == list.size()) {
return true;
}
}
}
@Transactional(rollbackFor = Exception.class)
public boolean fastSaveBatch(List<T> list) {
return fastSaveBatch(list, BATCH_SIZE);
}
public boolean updateAllColById(T t) {
return retBool(baseMapper.alwaysUpdateSomeColumnById(t));
}
}