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

Mybatis通用Mapper的CRUD操作封装BaseService 前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL。而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改。这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障。这时,通用Mapper便应运而生…… 如何实现 这里我们使用tk.Mapper实现,编写Base... 阅读详情

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

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

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

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

  1. 首先定义下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);

}
  1. 实现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();
    }
}

  1. 统一定义批量操作接口
/**
 * 批量操作接口
 *
 * @param <T>
 * @author sunchangtan
 */
@tk.mybatis.mapper.annotation.RegisterMapper
public interface BatchMapper<T> extends
        UpdateBatchByPrimaryKeySelectiveMapper<T> {
}
  1. 使用例子:
List<List<BatchTest>> splitList = ListUtils.splitList(list, 100);
        splitList.forEach(data -> {
            batchTestMapper.updateBatchByPrimaryKeySelective(data);
        });
Springboot 整合tk-mybatis , 妈妈,我再也不想敲CRUD的代码了! 前言 码农这一生,做的最多的四件事,不是吃喝玩乐,而是增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete) 。 泪目。 为何我要写这篇文章,是有感而发,请看图: 哈哈,虽然看着图一乐,但是大部分码农的工作生活确实现状如此。 也许会有人说了,其实很多crud的代码也只是复制粘贴而已,稍微改改就好。 这确实没错,但是人天性嗜懒,日复一日,不免对复制粘贴也产生了些许倦意。 那么为了我们每天都能元气满满,我们尽可能减少大部分我们‘... 阅读详情

相关推荐

coreldraw sp2精简版 x4_CorelDRAW X4下载-CorelDRAW X4 SP2 精简版_Win10镜像官网

CorelDRAW X4 SP2是一个专业图形设计软件,专用于矢量图形编辑与排版,借助其丰富的内容和专业图形设计、照片编辑和网站设计软件,您将能够随心所欲地表达自己的风格与创意,轻松创作徽标标志、广告标牌、车身贴和传单、模型绘制、插图描画、排版及分色输出等。CorelDRAW X4 SP2软件特色CorelDraw X4 相比两年前的 CorelDraw X3 加入了大量新特性,总计有50项以上,...

weixin_30346025的博客 8897

一种基于tk.mybatis的通用批量更新方法

项目中需要兼容多种类型数据库,在tk.mybatis的基础上扩展一个通用批量更新Provider和Mapper。

Zephyr_Syn 2103

夸克缓存视频合并小工具

原理 使用windows的命令行的copy命令来合并 copy /b 0+1+2+3 new.ts 分析缓存目录结构,发现都是一个m3u8文件带一个同名文件夹 所以分析m3u8并把原来的路径换成这个缓存文件夹路径并按顺序合并即可。 其中碰到的难点是Qprocess在windows不好使,索性直接存成.bat批处理文件再执行 还有就是中文问题,具体在代码里都说了。 代码 (环境Qt5.7.0) 这是mainwindow.h #ifndef MAINWINDOW_H #defin.

natural_Caduceus 1万+

tk.mybatis之批量更新修改数据,foreach和case when then实现笔记

批量更新介绍: tk.mybatis没有带批量更新的功能,批量更新却是经常使用 实现批量更新主要有两种方式: case when then方式:一条sql实现多条数据多个字段数据更新。 foreach方式:生成多条数据更新数据库。 foreach写法: 这种方式效率非常低下,比较普通的写法,是通过循环,依次执行update语句。 xml配置写法如下: <upd...

Seven71111的博客 1万+

【STM32实战】利用STM32CubeMX配置PWM互补输出驱动电机

本文详细介绍了如何利用STM32CubeMX配置STM32高级定时器的PWM互补输出功能,以驱动电机等需要半桥/全桥电路的应用。通过图形化界面设置定时器参数、使能互补通道并配置关键的死区时间,结合代码示例演示了如何启动PWM输出和动态调整占空比,确保输出安全、精确的互补信号,避免MOS管直通风险,提升驱动可靠性。

weixin_29161785的博客 535

3D视觉-激光三角测量法的概述和原理

激光三角法位移测量的原理是,用一束激光以某一角度聚焦在被测物体表面,然后从另一角度对物体表面上的激光光斑进行成像,物体表面激光照射点的位置高度不同,所接受散射或反射光线的角度也不同,用。激光三角测量法是一种通过图像采集系统采集被测物表面漫反射的激光轮廓,进而基于设备已知的相对位置通过算法处理,获得被测物表面的三维轮廓数据,进而还原目标物体三维空间信息的方法。采用激光三角原理和回波分析原理进行非接触位置、位移测量的精密传感器, 广泛应用于位置、位移 、厚度、半径、形状、振动、距离等几何量的工业测量。

qq_20660115的博客 3919

Mybatis之批量更新数据(批量update)

当我们使用mybatis的时候,可能经常会碰到一批数据的批量更新问题,因为如果一条数据一更新,那每一条数据就需要涉及到一次数据库的操作,包括网络IO以及磁盘IO,可想而知,这个效率是非常低下的。而平时我们很少直接使用原生jdbc直接操作数据库,而是会使用比较成熟的ORM框架,那么今天我们就来总结一下,如何使用mybatis做批量更新。

carbuser_xl的博客 9万+

工业异常检测评价指标(I-AUROC、PRO等)

模型评价指标:TPR、FPR、Recall、ROC、AUC、AUROC、IoU、PRO、AUPRO等

qq_1532145264的博客 7432

tk-mybatis使用

一、序言 二、组件介绍 1、前置条件 2、独立性和兼容性 3、环境的搭建 ⑴、独立环境的使用 ①自定义mybatis-config.xml配置文件 ②创建测试表以及数据 ③构建SqlSessionFactory ④创建PO对象以及Mapper接口 ⑤配置和测试Mapper对象 ⑥小结 ⑵、基于Spring环境(不依赖于与m...

西西 1万+

C2000 ePWM与SDFM同步配置:从寄存器到Driverlib实战解析

在嵌入式实时控制系统中,脉宽调制(PWM)是实现电机驱动、数字电源等应用的核心技术,其信号质量和时序精度直接决定了系统性能。为实现精确控制,PWM信号常需与模数转换器(ADC)或Sigma-Delta滤波器(SDFM)的采样时刻严格同步,以消除开关噪声并获取准确的反馈信号。其技术原理在于通过硬件同步机制,将PWM的特定时间点(如周期中心)作为触发源,控制数据采集的启动时刻。这种硬件级同步能有效提升闭环控制的稳定性和动态响应速度,广泛应用于伺服驱动、变频器等高性能场景。本文聚焦于TI C2000系列微控制器,

weixin_33692284的博客 443

基于STM32L4XX、HAL库的MP2672GD-0000-Z充电芯片驱动程序设计

CHG_STAT_GPIO_Port, CHG_STAT_Pin, // 这些宏应由 CubeMX 生成在 main.h。

zhusl6688的博客 496

mybatis - 通过3种方式 批量更新

通过foreach批量更新 通过case when批量更新(100条级别使用,批量更新数据太多会适得其反) 通过ExecutorType.Batch批量更新 通过foreach批量更新 ## mysql update table set id=1,name="泽虞生" where id = 1; update table set id=2,name="泽虞生" where id = 2;...

Seven-K 2328

基于 STM32 的全自动洗车监控系统设计与实现

本文提出一种基于 STM32F103RCT6 芯片的全自动洗车监控系统方案,通过多传感器融合与智能控制算法,实现车辆检测、洗车流程自动化及状态远程监控。系统集成硬件选型、电路设计、软件流程及通信功能,可广泛应用于智能洗车场景。

weixin_42300449的博客 964

tk.mybatis如何直接写sql执行

复用 tk.mybatis 条件构造器,实现特殊操作(如字段运算、安全更新)。

leijmdas的专栏 1274

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MyBatis、TK MyBatis和MyBatisPlus的区别

MyBatis、tk-MyBatis(通用Mapper)和MyBatisPlus都是Java持久层框架,但定位和适用场景有所不同。

weixin_44426414的博客 1340

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MyBatis-Plus与TK-Mapper代码生成器实战指南

ORM框架是Java后端开发中处理数据库操作的核心组件,通过对象关系映射技术简化了数据库交互。MyBatis-Plus作为MyBatis的增强工具,配合TK-Mapper的通用Mapper实现,可以大幅提升开发效率。代码自动生成技术通过解析数据库表结构,自动创建实体类、Mapper接口及XML映射文件,减少重复劳动。在Spring Boot项目中,通过配置MyBatis-Plus Generator和TK-Mapper插件,开发者可以快速生成基础CRUD代码,并支持Lombok注解、分页查询等高级功能。这种

cnracht8153的博客 344

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

tkMapper 通用mapper的批量更新 批量新增 官方实现 springboot项目 依赖引入

tkmapper 批量更新 批量插入 官方引入

CC学java 1644

tk.mybatis扩展通用方法实现新增/修改后返回实体对象

1.介绍 因为以前使用的jpa封装的方法在更新和新增后返回的是最后保存的实体,但是现在想换成tk.mybatis框架然而此框架返回的是修改后影响的行数不太符合要求,于是就想办法抽离出通用的扩展方法,可能不是很严谨但是一般的使用却没问题。 2.公共接口 继承tk.mybatis 的Mapper 接口中的static方法可以抽到工具类中 public interface IBaseDao<T> extends Mapper<T>, IdsMapper<T>, InsertL

单筱风的博客 3097

TK mapper与 PageHelper

TKmapper(通用Mapper)和MPmapepr(MyBatis-Plus)是mybatis两大插件,功能相同,都提供了常规的增删改查操作,增强mybatis的功能,篇幅有限,文章仅说下两者的区别! PageHelper是一个分页插件 目录 TKmapper 1.Spring Boot 集成 2.Example 用法 3.Mapper接口 4.Mybatis Geneat...

晨港飞燕的专栏 2157

mybatis-plus与tk.mybatis对比参考

tk.mybatis mybatis-plus:service接口 mybatis-plus:mapper接口 查询 T selectByPrimaryKey T getById T selectById int selectCount int count Integer selectCount List<T> selectByExample ...

weixin_43838328的博客 2160

使用tk.mybatis.mapper.common下的接口方法实现类似JPA操作

tk.mybatis.mapper.common包下提供有许多增删查改的接口方法,我们能直接使用或者对这些方法进行扩展使用来达到类似JPA操作数据库的效果。

qq_36599564的博客 1228

基于tk.mybatis:mapper实现的通用多表查询,更新操作及上传jar到maven中心仓库(一)

一、前言    本人使用mybatis也有些年头了。对于mybatis的使用也有点个人的心得。个人感觉mybatis在使用起来比hibernate方便且轻量级,这也是我喜欢使用mybatis的原因之一。但是每次在过了一段时间之后就会出现mybatis的xml文件里面的sql语句越来越多,看起来也不是十分美观,也不是很方便。在之前我也试过建立通用的BaseMapper来解决这个问题,BaseMapp...

初学程序员 2万+

12第九章:01_通用Mapper接口扩展

通用Mapper接口扩展

niujifei的博客 203

tk.Mybatis通过泛型扩展通用查询单表API接口

需求原因: 现在有单表查询需求,但是表数量众多,查询字段不确定,还需要使用时间区间进行查询(使用的时间字段可能会更新,也可能会增加其他查询条件)。 思路: 构造一个基类保存查询参数和查询泛型。使用公共方法,查询任意字段的值和时间字段的区间,可在子类扩展任意查询方法 查询基类 QueryBase package cn.?.model; import lombok.Data; import java.util.List; /** * @author XiongJl * @da..

Xiong_j_L的博客 846

Java-15 深入浅出MyBatis 分页与通用 Mapper 实战:PageHelper + tk.mybatis 从配置到分页查询

本篇系统讲解 MyBatis 生态下两大高频插件 —— **PageHelper 分页插件**与 **tk.mybatis 通用 Mapper**。PageHelper 通过 `MyBatis Interceptor` 拦截 `Executor.query`,在原始 SQL 上自动拼接 `LIMIT/OFFSET`(MySQL)、`ROWNUM`(Oracle)等方言分页语句,并先发一条 `SELECT count(*)` 获取总记录数,最终封装为 `PageInfo` 返回;tk.mybatis 通用 M

谢谢你的喜欢 我们一起无限进步 3208
上一篇: javascript XMLHttpRequest实现下载文件
下一篇: mybatis如何开启batch模式
sunct
博客等级 码龄19年 45粉丝 178原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值