详解扩展tk.mybatis的批量更新的功能

tk.mybatis没有带批量更新的功能,批量更新却是经常使用的,所以需要自己实现。

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

但是foreachzhe这种方式效率非常低下,不知道为何那多么帖子在流传,请看我另一个文章。

扩展tk.mybatis的批量更新,采用case when方式,源码干货如下:

首先定义下mapper接口

import org.apache.ibatis.annotations.UpdateProvider;

import java.util.List;

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

    /**
     * 根据Example条件批量更新实体`record`包含的不是null的属性值
     *
     * @return
     */
    @UpdateProvider(type = BatchExampleProvider.class, method = "dynamicSQL")
    int updateBatchByPrimaryKeySelective(List recordList);

}

实现UpdatePriUpdateProvider,使用case when方式拼写mapper动态语句,必须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("");

        //获取全部列
        Set columnList = EntityHelper.getColumns(entityClass);
        for (EntityColumn column : columnList) {
            if (!column.isId() && column.isUpdatable()) {
                sql.append("  ");
                sql.append("    ");
                sql.append("      ");
                sql.append("         when id=#{i.id} then #{i."+column.getEntityField().getName()+"}");
                sql.append("      ");
                sql.append("    ");
                sql.append("  ");
            }
        }

        sql.append("");
        sql.append("WHERE");
        sql.append(" id IN ");
        sql.append("");
        sql.append("");
        sql.append("#{i.id}");
        sql.append("");
        sql.append("");

        return sql.toString();
    }
}

统一定义批量操作接口

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

使用例子:

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

到此这篇关于详解扩展tk.mybatis的批量更新的功能的文章就介绍到这了,更多相关tk.mybatis 批量更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(详解扩展tk.mybatis的批量更新的功能)