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

 更新时间:2021年12月01日 15:33:54   作者:sunct  
tk.mybatis没有带批量更新的功能,批量更新却是经常使用的,所以本文介绍了一下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 <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 批量更新内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决IDEA JSP没有代码提示问题的几种方法

    解决IDEA JSP没有代码提示问题的几种方法

    这篇文章主要介绍了解决IDEA JSP没有代码提示问题的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 详解SpringIOC容器中bean的作用范围和生命周期

    详解SpringIOC容器中bean的作用范围和生命周期

    这篇文章主要介绍了SpringIOC容器中bean的作用范围和生命周期,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • java创建txt文件并存入内容

    java创建txt文件并存入内容

    这篇文章主要为大家详细介绍了java创建txt文件并存入内容,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Java实现对象排序的两种方式详解

    Java实现对象排序的两种方式详解

    这篇文章主要介绍了Java实现对象排序的两种方式详解,在Java中经常会涉及到对象数组的排序问题,则就提到对象之间的比较问题,今天我们就来看一下两种不同排序方式之间的区别,需要的朋友可以参考下
    2023-09-09
  • Java将字符串写入文本文件代码示例

    Java将字符串写入文本文件代码示例

    这篇文章主要介绍了Java将字符串写入文本文件代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringBoot整合Redisson的步骤(单机版)

    SpringBoot整合Redisson的步骤(单机版)

    Redisson非常适用于分布式锁,而我们的一项业务需要考虑分布式锁这个应用场景,于是我整合它做一个初步简单的例子(和整合redis一样)。
    2021-05-05
  • 基于MyBatis XML配置方法(全面了解)

    基于MyBatis XML配置方法(全面了解)

    下面小编就为大家带来一篇基于MyBatis XML配置方法(全面了解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • MyBatis-Plus 批量保存的操作方法

    MyBatis-Plus 批量保存的操作方法

    在项目开发中,需要插入批量插入20多万条数据,通过日志观察,发现在调用MyBatis-Plus中的saveBatch()方法性能非常的差,本篇文章主要分享一下saveBatch()的原理以及使用的注意事项,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • springboot 自定义配置Boolean属性不生效的解决

    springboot 自定义配置Boolean属性不生效的解决

    这篇文章主要介绍了springboot 自定义配置Boolean属性不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java实现简单画画画板

    Java实现简单画画画板

    这篇文章主要为大家详细介绍了Java实现简单画画画板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论