欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-09 08:20:54
tk.mybatis没有带批量更新的功能,批量更新却是经常使用的,所以需要自己实现。批量更新网上主要有2种方式:case when方式、foreach方式但是foreachzhe这种方式效率非常低下,...

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

批量更新网上主要有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> {

    /**
     * 根据example条件批量更新实体`record`包含的不是null的属性值
     *
     * @return
     */
    @updateprovider(type = batchexampleprovider.class, method = "dynamicsql")
    int updatebatchbyprimarykeyselective(list<? extends t> 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("<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();
    }
}

统一定义批量操作接口

/**
 * 批量操作接口
 *
 * @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 批量更新内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!