扩展MyBatisPlus全字段更新、优化批量插入
一、场景
- Myabtis Plus默认没有集成全字段更新,不满足将字段值设置为null的需求
- 单条SQL批量插入,内置saveBatch方法是多条insert语句,批量提交,效率低
二、优化
2.1 扩展mapper层
mybatis plus官方有三个选装插件
文档
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;
}
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));
}
}
搞定收工!
以上是 扩展MyBatisPlus全字段更新、优化批量插入 的全部内容, 来源链接: utcz.com/z/515839.html