欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis-plus saveOrUpdateBatch踩坑記錄

 更新時間:2023年12月08日 09:42:48   作者:Dango丶小七  
這篇文章主要介紹了mybatis-plus saveOrUpdateBatch踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

mybatis-plus saveOrUpdateBatch踩坑

mybatis-plus版本: 3.5.1

調(diào)用方法

@Transactional(rollbackFor = Exception.class)  
default boolean saveOrUpdateBatch(Collection<T> entityList) {  
    return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE);  
}

問題說明

當對entityList進行批量更新操作時,方法內(nèi)部會根據(jù)主鍵查詢該記錄,導致批量更新操作十分緩慢

具體代碼如下:

@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize) {
    TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass);
    Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
    String keyProperty = tableInfo.getKeyProperty();
    Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
    return SqlHelper.saveOrUpdateBatch(this.entityClass, this.mapperClass, this.log, entityList, batchSize, (sqlSession, entity) -> {
        Object idVal = tableInfo.getPropertyValue(entity, keyProperty);
        // 當主鍵存在時,會執(zhí)行sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_BY_ID), entity)查詢該條記錄
        return StringUtils.checkValNull(idVal) || CollectionUtils.isEmpty(sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_BY_ID), entity));
    }, (sqlSession, entity) -> {
        MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
        param.put(Constants.ENTITY, entity);
        sqlSession.update(getSqlStatement(SqlMethod.UPDATE_BY_ID), param);
    });
}
public static <E> boolean saveOrUpdateBatch(Class<?> entityClass, Class<?> mapper, Log log, Collection<E> list, int batchSize, BiPredicate<SqlSession, E> predicate, BiConsumer<SqlSession, E> consumer) {
	String sqlStatement = getSqlStatement(mapper, SqlMethod.INSERT_ONE);
	return executeBatch(entityClass, log, list, batchSize, (sqlSession, entity) -> {
		// 執(zhí)行predicate
		if (predicate.test(sqlSession, entity)) {
			sqlSession.insert(sqlStatement, entity);
		} else {
			consumer.accept(sqlSession, entity);
		}
	});
}

public static <E> boolean executeBatch(Class<?> entityClass, Log log, Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {
	Assert.isFalse(batchSize < 1, "batchSize must not be less than one");
	return !CollectionUtils.isEmpty(list) && executeBatch(entityClass, log, sqlSession -> {
		int size = list.size();
		int idxLimit = Math.min(batchSize, size);
		int i = 1;
		for (E element : list) {
			// 循環(huán)每條記錄,執(zhí)行consumer,在此次調(diào)用中,consumer中會執(zhí)行predicate,當該條記錄主鍵不為空時,會通過主鍵查詢該記錄
			consumer.accept(sqlSession, element);
			if (i == idxLimit) {
				sqlSession.flushStatements();
				idxLimit = Math.min(idxLimit + batchSize, size);
			}
			i++;
		}
	});
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論