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项目 依赖引入
文章目录 场景官方插件源码解析项目细节小结 场景 在许多业务场景下,需要对tkMapper的功能进行增强,需要用到批量新增和批量更新(这里是唯一主键去更新的),许多论文博客自己写的看起来并不行,我们这里就采…...
【leetcode刷刷】回溯:77.组合
77. 组合 第一次专门做回溯,有点难理解。首先可以理解回溯可以可视化为树的搜索,因此这道题,树的宽度为n,树的深度为kpath作为一个参数传入有点难想回溯没有返回值剪纸更难想,通过列算式可以勉强得到for的表达式&…...
【OOP】Python的OOP编程笔记
1.类变量和实例变量 类变量:变量属于类,在对象中是共用的。访问方式为类名.变量名,或对象名.__class__.变量名 实例变量:定义在方法中的变量,属于具体对象。访问方式为对象名.变量名 类变量访问方式 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版本前后区别 首先文件系统变化,由EXT4,变为XFS格式。可支持容量500TB的文件,而6代仅能支持16TB。首个进程变为systemd, 替换了熟悉的init进程。它的特点是功能强大,体积也很强大。 systemd给我们带来了一个全家桶命令&…...
001集—shapefile(.shp)格式详解——arcgis
一、什么是shapefile Shapefile 是一种用于存储地理要素的几何位置和属性信息的非拓扑简单格式。shapefile 中的地理要素可通过点、线或面(区域)来表示。包含 shapefile 的工作空间还可以包含 dBASE 表,它们用于存储可连接到 shapefile 的要…...
ssrf服务器请求伪造漏洞(个人学习)
SSRF前置学习须了解net工作原理 计算机网络 网络地址转换NAT_内部本地地址-CSDN博客 可以看这个来了解 SSRF 攻击的目标:从外网无法访问的内部网络 形成原因:大部分服务器提供了从外部应用获取数据的功能,但是对目标地址没有做过滤和限制…...
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
文章目录: 1. 下拉菜单 2. 文本域3.label标签 4.按钮- button 4.1 reset重置按钮结合form表单区域使用 5.无语义的布局标签 6.字符实体 注册信息综合案例 表单第二节 1. 下拉菜单 标签: select嵌套option,select是下拉菜单整体,option是下拉菜单的每一项。 代码…...
回响科技二面面试题解答
面试题 1、你们的数仓中DWD层为什么要划分数据域?划分数据域之后会对ADS层造成什么影响?是可以提效还是可扩展性强?你们是如何考虑的呢? 2、AZkaban和dolphinScheduler的区别是什么?如果选型会从哪几个方面来考虑呢&a…...
node学习过程中的终端命令
冷的哥们手真tm冷,打字都是僵的,屮 目录 一、在学习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 等,但在早期,Oracle 的版本号并不包含这些字母。 最初,Oracle 的版本号简单地是 1、2、3、4 等,一直发展到 1999 年发布的 8i 版本。20 世纪末是互联网爆发式发展的时代。 …...
Unity2D_角色移动跳跃
水平移动 Rigidbody2D 使用Unity自带的刚体组件,通过修改刚体物品中Rigidbody2D的属性velocity速度来实现物体移动 声明Rigidbody2D属性,以及角色移动速度 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) 引言 计算任务完成时间周期,和计算金钱一样,是一个比较细致严谨的工作。 通常,我们可能以为,完成周期形如: 任务完成周期 任务结束时间 - 任务开始时间 但是…...
JavaWeb后端登录校验功能(JWT令牌技术,Cookie技术,Session,拦截技术,过滤器)
目录 一.登录校验功能(解决直接通过路径访问) 1.实现思路 二.会话技术 编辑 1.Cookie技术 2.Session 3.令牌技术 1.简介 2.如何生成和解析 3.令牌的使用 三.Filter过滤器 1.什么是过滤器 2.实现步骤: 3.过滤器执行流程 4.拦截路径 5.过…...
7-上传下载
上传下载 首先创建一张上传文件的表,例如: 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算法具有以下优势: ①实时性:能够在实时应用中进行快速的特征点检测和描述。 ②...
算法每日一题: 边权重均等查询 | 公共子祖先
大家好,我是星恒,今天给大家带来的是一道图里面有关公共子祖先的题目,理解起来简单,大家 题目:leetcode 2846 现有一棵由 n 个节点组成的无向树,节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n …...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
