当前位置: 首页 > news >正文

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

文章目录

    • 场景
    • 官方插件
    • 源码解析
    • 项目细节
    • 小结

场景

在许多业务场景下,需要对tkMapper的功能进行增强,需要用到批量新增和批量更新(这里是唯一主键去更新的),许多论文博客自己写的看起来并不行,我们这里就采用官方的模式,一次跑通

官方插件

这里是我通过中央仓库发现的一个宝库,平常对额外功能的增强需要自己常在中央仓库去逛逛看。

依赖地址:

<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>4.2.3</version>
</dependency>
<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-extra</artifactId><version>4.2.3</version>
</dependency>

starter是启动器,extra则是扩展插件,里面就有我们所需的功能

源码解析

我们来看看官方作者的实现方式到底是什么,看看这个具体的provider的实现原理,其实底层就是foreach

package tk.mybatis.mapper.additional.update.batch;import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.UpdateProvider;
import tk.mybatis.mapper.annotation.RegisterMapper;@RegisterMapper
public interface BatchUpdateMapper<T> {@UpdateProvider(type = BatchUpdateProvider.class,method = "dynamicSQL")void batchUpdate(@Param("list") List<? extends T> recordList);
}
package tk.mybatis.mapper.additional.update.batch;import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;public class BatchUpdateProvider extends MapperTemplate {public BatchUpdateProvider(Class<?> mapperClass, MapperHelper mapperHelper) {super(mapperClass, mapperHelper);}public String batchUpdate(MappedStatement ms) {Class<?> entityClass = this.getEntityClass(ms);StringBuilder sql = new StringBuilder();sql.append("<foreach collection=\"list\" item=\"record\" separator=\";\" >");sql.append(SqlHelper.updateTable(entityClass, this.tableName(entityClass)));sql.append(SqlHelper.updateSetColumns(entityClass, "record", false, false));sql.append(SqlHelper.wherePKColumns(entityClass, "record", true));sql.append("</foreach>");return sql.toString();}public String batchUpdateSelective(MappedStatement ms) {Class<?> entityClass = this.getEntityClass(ms);StringBuilder sql = new StringBuilder();sql.append("<foreach collection=\"list\" item=\"record\" separator=\";\" >");sql.append(SqlHelper.updateTable(entityClass, this.tableName(entityClass)));sql.append(SqlHelper.updateSetColumns(entityClass, "record", true, this.isNotEmpty()));sql.append(SqlHelper.wherePKColumns(entityClass, "record", true));sql.append("</foreach>");return sql.toString();}
}

项目细节

我们通常在自己的项目,都要所有的mapper都是继承我们自定义的BaseMapper,这里我也给上我常用的,后续要扩展功能,只要在BaseMapper上扩展即可

import tk.mybatis.mapper.additional.idlist.IdListMapper;
import tk.mybatis.mapper.additional.update.batch.BatchUpdateMapper;
import tk.mybatis.mapper.annotation.RegisterMapper;
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.special.InsertListMapper;/*** BaseMapper* TIP:basePackage的属性值 不能包含通用mapper所在的包,所以不能放在./mapper下,启动会报错** @param <T>*/
@RegisterMapper
public interface BaseMapper<T> extends Mapper<T>, IdListMapper<T, Long>, IdsMapper<T>, InsertListMapper<T>, BatchUpdateMapper<T> {}

小结

希望能够帮到你,总之我知道要实现的什么功能最好去看看作者的作品

相关文章:

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

文章目录 场景官方插件源码解析项目细节小结 场景 在许多业务场景下&#xff0c;需要对tkMapper的功能进行增强&#xff0c;需要用到批量新增和批量更新&#xff08;这里是唯一主键去更新的&#xff09;&#xff0c;许多论文博客自己写的看起来并不行&#xff0c;我们这里就采…...

【leetcode刷刷】回溯:77.组合

77. 组合 第一次专门做回溯&#xff0c;有点难理解。首先可以理解回溯可以可视化为树的搜索&#xff0c;因此这道题&#xff0c;树的宽度为n&#xff0c;树的深度为kpath作为一个参数传入有点难想回溯没有返回值剪纸更难想&#xff0c;通过列算式可以勉强得到for的表达式&…...

【OOP】Python的OOP编程笔记

1.类变量和实例变量 类变量&#xff1a;变量属于类&#xff0c;在对象中是共用的。访问方式为类名.变量名&#xff0c;或对象名.__class__.变量名 实例变量&#xff1a;定义在方法中的变量&#xff0c;属于具体对象。访问方式为对象名.变量名 类变量访问方式 class Car:# nu…...

一进一出模拟量信号隔离变送器

一进一出模拟量信号隔离变送器 捷晟达科技推出一进一出模拟量信号隔离变送器 深圳捷晟达科技推出一款具有隔离,放大,转换保护功能的一进一出的小型隔离变送器设备,该设备可以把模拟量(4-20mA/0-10V等)标准信号转换用户需要的信号,该产品具有抗EMC干扰,可以有效的保护后级设备安…...

Mybatis-plus原生pages分页未生效的解决方案

文章目录 前言原因1、Mybatis Plus版本的问题2、Mapper.xml文件中SQL语句格式问题3、Mybatis Plus默认分页拦截器问题4、分页参数传参问题5、分页配置的问题 解决方案1、升级对应的Mybatis-plus版本分页插件配置问题3、自定义分页拦截器4、正确的参数5、不同版本的配置文件3.4.…...

【linux】-centos7版本前后-变化篇

1.centos7版本前后区别 首先文件系统变化&#xff0c;由EXT4&#xff0c;变为XFS格式。可支持容量500TB的文件&#xff0c;而6代仅能支持16TB。首个进程变为systemd, 替换了熟悉的init进程。它的特点是功能强大&#xff0c;体积也很强大。 systemd给我们带来了一个全家桶命令&…...

001集—shapefile(.shp)格式详解——arcgis

一、什么是shapefile Shapefile 是一种用于存储地理要素的几何位置和属性信息的非拓扑简单格式。shapefile 中的地理要素可通过点、线或面&#xff08;区域&#xff09;来表示。包含 shapefile 的工作空间还可以包含 dBASE 表&#xff0c;它们用于存储可连接到 shapefile 的要…...

ssrf服务器请求伪造漏洞(个人学习)

SSRF前置学习须了解net工作原理 计算机网络 网络地址转换NAT_内部本地地址-CSDN博客 可以看这个来了解 SSRF 攻击的目标&#xff1a;从外网无法访问的内部网络 形成原因&#xff1a;大部分服务器提供了从外部应用获取数据的功能&#xff0c;但是对目标地址没有做过滤和限制…...

【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】

文章目录: 1. 下拉菜单 2. 文本域3.label标签 4.按钮- button 4.1 reset重置按钮结合form表单区域使用 5.无语义的布局标签 6.字符实体 注册信息综合案例 表单第二节 1. 下拉菜单 标签: select嵌套option,select是下拉菜单整体&#xff0c;option是下拉菜单的每一项。 代码…...

回响科技二面面试题解答

面试题 1、你们的数仓中DWD层为什么要划分数据域&#xff1f;划分数据域之后会对ADS层造成什么影响&#xff1f;是可以提效还是可扩展性强&#xff1f;你们是如何考虑的呢&#xff1f; 2、AZkaban和dolphinScheduler的区别是什么&#xff1f;如果选型会从哪几个方面来考虑呢&a…...

node学习过程中的终端命令

冷的哥们手真tm冷&#xff0c;打字都是僵的&#xff0c;屮 目录 一、在学习nodejs过程中用到的终端命令总结 一、在学习nodejs过程中用到的终端命令 node -v nvm install 20.11.0 nvm list nvm list available nvm on nvm -v nvm use 20.11.0 node加要运行的js文件路径 ps&a…...

oracle版本号中的i,G,C代表什么含义

大家都熟悉的 Oracle 版本号有 9i、10G、11G、12C、19C 等&#xff0c;但在早期&#xff0c;Oracle 的版本号并不包含这些字母。 最初&#xff0c;Oracle 的版本号简单地是 1、2、3、4 等&#xff0c;一直发展到 1999 年发布的 8i 版本。20 世纪末是互联网爆发式发展的时代。 …...

Unity2D_角色移动跳跃

水平移动 Rigidbody2D 使用Unity自带的刚体组件&#xff0c;通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动 声明Rigidbody2D属性&#xff0c;以及角色移动速度 public float playerSpeed 5f; private Rigidbody2D rigidbody2D;在Start方法中将rigidbody2D…...

23-GPTs Actions详细解析:如何查找、对接API,及如何编写Schema

目录 1. 挖掘一个API接口,并将其对接到GPTs中1.1 如何寻找API1.2 把API对接到Schema中1.3 Schema中的参数结构本节详细介绍GPTs Actions 中的Schema。如何写、它里面的结构是什么、里面参数的含义。 后续使用GPTs过程中,如何找到自己想要的API,以及如何把找到的API对接到GPT…...

微信小程序canvas画布实现椭圆元素自由缩放、移动功能

目录 实现效果 ​编辑 一、获取画布信息并绘制背景 二、绘制椭圆...

使用Excel计算--任务完成总工作日时长

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 引言 计算任务完成时间周期&#xff0c;和计算金钱一样&#xff0c;是一个比较细致严谨的工作。 通常&#xff0c;我们可能以为&#xff0c;完成周期形如&#xff1a; 任务完成周期 任务结束时间 - 任务开始时间 但是…...

JavaWeb后端登录校验功能(JWT令牌技术,Cookie技术,Session,拦截技术,过滤器)

目录 一.登录校验功能&#xff08;解决直接通过路径访问&#xff09; 1.实现思路 二.会话技术 ​编辑 1.Cookie技术 2.Session 3.令牌技术 1.简介 2.如何生成和解析 3.令牌的使用 三.Filter过滤器 1.什么是过滤器 2.实现步骤&#xff1a; 3.过滤器执行流程 4.拦截路径 5.过…...

7-上传下载

上传下载 首先创建一张上传文件的表&#xff0c;例如&#xff1a; drop table if exists sys_file_info; create table sys_file_info (file_id int(11) not null auto_increment comment 文件id,file_name varchar(50) default …...

数字图像处理(实践篇)三十六 OpenCV-Python 使用ORB和BFmatcher对两个输入图像的关键点进行匹配实践

目录 一 涉及的函数 二 实践 ORB(Oriented FAST and Rotated BRIEF)是一种特征点检测和描述算法,它结合了FAST关键点检测和BRIEF描述子。ORB算法具有以下优势: ①实时性:能够在实时应用中进行快速的特征点检测和描述。 ②...

算法每日一题: 边权重均等查询 | 公共子祖先

大家好&#xff0c;我是星恒&#xff0c;今天给大家带来的是一道图里面有关公共子祖先的题目&#xff0c;理解起来简单&#xff0c;大家 题目&#xff1a;leetcode 2846 现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n …...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...