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

詳解擴展tk.mybatis的批量更新的功能

 更新時間:2021年12月01日 15:33:54   作者:sunct  
tk.mybatis沒有帶批量更新的功能,批量更新卻是經常使用的,所以本文介紹了一下tk.mybatis的批量更新功能,感興趣的可以了解一下

tk.mybatis沒有帶批量更新的功能,批量更新卻是經常使用的,所以需要自己實現(xiàn)。

批量更新網上主要有2種方式:case when方式、foreach方式

但是foreachzhe這種方式效率非常低下,不知道為何那多么帖子在流傳,請看我另一個文章。

擴展tk.mybatis的批量更新,采用case when方式,源碼干貨如下:

首先定義下mapper接口

import org.apache.ibatis.annotations.UpdateProvider;

import java.util.List;

/**
 * 批量update
 *
 * @param <T> 不能為空
 */
@tk.mybatis.mapper.annotation.RegisterMapper
public interface UpdateBatchByPrimaryKeySelectiveMapper<T> {

    /**
     * 根據(jù)Example條件批量更新實體`record`包含的不是null的屬性值
     *
     * @return
     */
    @UpdateProvider(type = BatchExampleProvider.class, method = "dynamicSQL")
    int updateBatchByPrimaryKeySelective(List<? extends T> recordList);

}

實現(xiàn)UpdatePriUpdateProvider,使用case when方式拼寫mapper動態(tài)語句,必須id為主鍵

import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.mapperhelper.EntityHelper;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.SqlHelper;
import tk.mybatis.mapper.provider.ExampleProvider;

import java.util.Set;

/**
 * 批量更新的SqlProvider
 * @author sunchangtan
 */

public class BatchExampleProvider extends ExampleProvider {

    public BatchExampleProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
        super(mapperClass, mapperHelper);
    }


    /**
     * 拼update sql, 使用case when方式,id為主鍵
     *
     * @param ms
     * @return
     */
    public String updateBatchByPrimaryKeySelective(MappedStatement ms) {
        final Class<?> entityClass = getEntityClass(ms);
        //開始拼sql
        StringBuilder sql = new StringBuilder();
        sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass)));
        sql.append("<trim prefix=\"set\" suffixOverrides=\",\">");

        //獲取全部列
        Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
        for (EntityColumn column : columnList) {
            if (!column.isId() && column.isUpdatable()) {
                sql.append("  <trim prefix=\""+column.getColumn()+" =case\" suffix=\"end,\">");
                sql.append("    <foreach collection=\"list\" item=\"i\" index=\"index\">");
                sql.append("      <if test=\"i."+column.getEntityField().getName()+"!=null\">");
                sql.append("         when id=#{i.id} then #{i."+column.getEntityField().getName()+"}");
                sql.append("      </if>");
                sql.append("    </foreach>");
                sql.append("  </trim>");
            }
        }

        sql.append("</trim>");
        sql.append("WHERE");
        sql.append(" id IN ");
        sql.append("<trim prefix=\"(\" suffix=\")\">");
        sql.append("<foreach collection=\"list\" separator=\", \" item=\"i\" index=\"index\" >");
        sql.append("#{i.id}");
        sql.append("</foreach>");
        sql.append("</trim>");

        return sql.toString();
    }
}

統(tǒng)一定義批量操作接口

/**
 * 批量操作接口
 *
 * @param <T>
 * @author sunchangtan
 */
@tk.mybatis.mapper.annotation.RegisterMapper
public interface BatchMapper<T> extends
        UpdateBatchByPrimaryKeySelectiveMapper<T> {
}

使用例子:

List<List<BatchTest>> splitList = ListUtils.splitList(list, 100);
        splitList.forEach(data -> {
            batchTestMapper.updateBatchByPrimaryKeySelective(data);
        });

到此這篇關于詳解擴展tk.mybatis的批量更新的功能的文章就介紹到這了,更多相關tk.mybatis 批量更新內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論