Mybatis Plus入门进阶:特殊符号、动态条件、公共语句、关联查询、多租户插件
前言
Mybatis Plus入门进阶:特殊符号、动态条件、公共语句、关联查询、多租户插件
隐藏问题:批量插入saveBatch
文章目录
- 前言
- 注意点
- 动态条件
- xml公共语句
- 关联查询
- 动态表名
- 使用自定义函数
- 主键生成策略
- saveBatch
- 插件:多租户TenantLineInnerInterceptor
注意点
-
mapper.xml中大于、小于需要使用特殊符号
< < 小于号 > > 大于号 & & 和 ' ' 单引号 " " 双引号 <= <= 小于等于 >= >= 大于等于 -
如果需要拼接 <br/> 字符串,可以使用 CDATA 包裹起来,让解析器将其视为文本而非标签
<sql id="exampleSql"><![CDATA[SELECT column1,column2,CONCAT(column3, '<br/>', column4) AS combinedColumnFROM your_table]]> </sql>
动态条件
-
使用if对参数值进行判断,非空才查询
<if test="roleName != null and roleName != ''">AND r.role_name like concat('%', #{roleName}, '%') </if>- 参考
-
多个条件判断
-
使用多个if
<if test = ""></if> <if test = ""></if> -
使用when/otherwise
<choose><when test="status == 2">create_time DESC</when><otherwise>create_time</otherwise> </choose>
-
xml公共语句
-
定义
<sql id="xxx">select a from b </sql> -
使用
<select id = "yyy"><include refId="xxx"></include>where name = 'mango' </select>
关联查询
-
一对一
-
正常的查询sql,定义返回的结果类型:resultMap
<select id="selectRoleAll" resultMap="SysRoleResult">select * from A left join B ... </select><resultMap type="SysRole" id="SysRoleResult"><id property="roleId" column="role_id" /><result property="roleName" column="role_name" /> </resultMap>
-
-
一对多
-
A表与B表关联查询,其中A表与B表为一对多的关系,则查询结果使用<collection>
<resultMap id = "xxx" type="com.xxxx"><id column="id" property="id" /><collection property="yyy" ofType=zzz><result property="no" column="no"/></collection> </resultMap> -
列名重复问题==> 使用别名
-
分页存在问题(不建议分页时使用)==> 使用select
-
相关参考文章:
-
Mybatis Plus内置的分页查询
-
collection分页问题总结
-
collection查询一对多分页数据的Bug
-
collection分页问题
动态表名
当我们想要传的参数是表格的名称或是列名的时候,#{}这种方式就不生效了,需要使用${}
使用自定义函数
在xml中,使用了数据库自定义的函数,则需要带上模式名,或者在当前的模式下创建函数
自定义的函数(达梦数据库),默认是在sysdba下
主键生成策略
@TableId注解定义了主键生成的类型,具体查看枚举类IdType.java
-
AUTO
- 数据库 ID自增,这种情况下将表中主键设置为自增,否则,没有设置主动设置id值进行插入时会报错
-
NONE
- 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里默认 ASSIGN_ID),注意这里官网文档有误
-
INPUT
- insert 前自行 set 主键值,在采用IKeyGenerator类型的ID生成器时必须为INPUT
-
ASSIGN_ID
- 分配ID (主键类型为number或string),默认实现为雪花算法
-
ASSIGN_UUID
- 分配 UUID
详细参考
saveBatch
-
特性及问题
-
拼接sql:如果集合中的某个实体和它的上/下一个不一样,就不会拼接到insert中,而是会单独执行插入语句,所以多个实体不一样(某个字段为null),会拼出多个插入语句
-
事务:事务回滚,如果在某一个拼接语句中,存在一条数据报错,那么整批会报错,如果上一批语句已经执行过了,则事务不会回滚,已经成功的仍旧是成功
-
-
解决方案:
-
使用其他的批量插入:this.baseMapper.insertBatchSomeColumn(list);
- 存在问题:数据库字段默认值不生效,需要手动对对象设值,或者对实体字段设值默认,如果为雪花算法,可使用IdWorker
-
自定义批量插入
-
设置插入字段策略
-
局部字段忽略控制:@TableField(fill = FieldFill.INSERT,insertStrategy = FieldStrategy.IGNORED)
-
全局
mybatis-plus:global-config:db-config:insert-strategy: ignored -
参考
-
-
插件:多租户TenantLineInnerInterceptor
处理逻辑类:BaseMultiTableInnerInterceptor
- 忽略某个方法,需要重写TenantLineInnerInterceptor中的beforeQuery
相关文章参考
引入及使用租户
忽略多租户隔离自定义注解(未验证)
-
新增租户配置信息
# 租户配置信息 tenant:# 是否开启租户模式enable: true# 需要排除的多租户的表exclusionTable: sys_config,sys_dict_data# 租户字段名称column: tenant_id -
对应增加配置类TenantProperties
@Configuration @Getter public class TenantProperties {/*** 是否开启租户模式*/@Value("${tenant.enable}")private Boolean enable;/*** 多租户字段名称*/@Value("${tenant.column}")private String column;/*** 需要排除的多租户的表*/@Value("${tenant.exclusionTable}")private List<String> exclusionTable; } -
注入重载的租户配置
@Configuration @RequiredArgsConstructor(onConstructor_ = @Autowired) @AutoConfigureBefore(MyBatisPlusConfig.class) public class TenantConfig {private final TenantProperties tenantProperties;@Beanpublic TenantLineInnerInterceptor tenantLineInnerInterceptor() {return new TenantLineInnerInterceptor(new TenantLineHandler() {@Overridepublic Expression getTenantId() {try {String tenantId = SecurityUtils.getLoginUser().getTenantId();if (tenantId != null) {return new StringValue(tenantId);}} catch (ServiceException e) {e.printStackTrace();}return new NullValue();}@Overridepublic String getTenantIdColumn() {return tenantProperties.getColumn();}@Overridepublic boolean ignoreTable(String tableName) {return tenantProperties.getExclusionTable().stream().anyMatch((t) -> t.equalsIgnoreCase(tableName));}@Overridepublic boolean ignoreInsert(List<Column> columns, String tenantIdColumn) {return TenantLineHandler.super.ignoreInsert(columns, tenantIdColumn);}});} } -
Mybatis Plus配置增加租户配置
@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 多租户插件if (tenantProperties.getEnable()) {interceptor.addInnerInterceptor(tenantLineInnerInterceptor);}return interceptor;}
相关文章:
Mybatis Plus入门进阶:特殊符号、动态条件、公共语句、关联查询、多租户插件
前言 Mybatis Plus入门进阶:特殊符号、动态条件、公共语句、关联查询、多租户插件 隐藏问题:批量插入saveBatch 文章目录 前言注意点动态条件xml公共语句关联查询动态表名使用自定义函数主键生成策略saveBatch插件:多租户TenantLineInnerInte…...
Webpack 什么是loader?什么是plugin?loader与plugin区别是什么?
什么是loader?什么是plugin? loader 本质为一个函数,将文件编译成可执行文件。webpack完成的工作是将依赖分析与tree shinking对于类似.vue或.scss结尾的文件无法编译理解这就需要实现一个loader完成文件转译成js、html、css、json等可执行文…...
js面向对象(工厂模式、构造函数模式、原型模式、原型和原型链)
1.封装 2. 工厂模式 function createCar(color, style){let obj new Object();obj.color color;obj.style style;return obj;}var car1 createCar("red","car1");var car2 createCar("green","car2"); 3. 构造函数模式 // 创建…...
grid网格布局,比flex方便太多了,介绍几种常用的grid布局属性
使用flex布局的痛点 如果使用justify-content: space-between;让子元素两端对齐,自动分配中间间距,假设一行4个,如果每一行都是4的倍数那没任何问题,但如果最后一行是2、3个的时候就会出现下面的状况: /* flex布局 两…...
企业如何凭借软文投放实现营销目标?
数字时代下,软文投放成为许多企业营销的主要方式,因为软文投放成本低且效果持续性强,最近也有不少企业来找媒介盒子进行软文投放,接下来媒介盒子就来给大家分享下,企业在软文投放中需要掌握哪些技巧,才能实…...
【AI】深度学习——循环神经网络
神经元不仅接收其他神经元的信息,也能接收自身的信息。 循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络,可以更方便地建模长时间间隔的相关性 常用的参数学习可以为BPTT。当输入序列比较…...
计算机网络中常见缩略词翻译及简明释要
强烈推荐OSI七层模型和TCP/IP四层模型,借用一下其中图片,版权归原作者 SW: 集线器(Hub)、交换机(SW)、路由器(router)对比区别 集线器是在物理层; 交换机&Mac地址是在数据链路层(Mac物理地址…...
UGUI交互组件ScrollView
一.ScrollView的结构 对象说明Scroll View挂有Scroll Rect组件的主体对象Viewport滚动显示区域,有Image和mask组件Content显示内容的父节点,只有个Rect Transform组件Scrollbar Horizontal水平滚动条Scrollbar Vertical垂直滚动条 二.Scroll Rect组件的属…...
【文件IO】文件系统的操作 流对象 字节流(Reader/Writer)和字符流 (InputStream/OutputStream)的用法
目录 1.文件系统的操作 (File类) 2.文件内容的读写 (Stream流对象) 2.1 字节流 2.2 字符流 2.3 如何判断输入输出? 2.4 reader读操作 (字符流) 2.5 文件描述符表 2.6 Writer写操作 (字符流) 2.7 InputStream (字节流) 2.8 OutputStream (字节流) 2.9 字节…...
计算机网络 | 数据链路层
计算机网络 | 数据链路层 计算机网络 | 数据链路层基本概念功能概述封装成帧与透明传输封装成帧透明传输字符计数法字符填充法零比特填充法违规编码法小结 差错控制差错是什么?差错从何而来?为什么要在数据链路层进行差错控制?检错编码奇偶校…...
C#,数值计算——分类与推理Gaumixmod的计算方法与源程序
1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Gaumixmod { private int nn { get; set; } private int kk { get; set; } private int mm { get; set; } private double…...
【Android】Intel HAXM installation failed!
Android Studio虚拟机配置出现Intel HAXM installation failed 如果方案一解决没有作用,就用方案二再试一遍 解决方案一: 1.打开控制面板 2.点击左侧下面最后一个程序 3.点击启用或关闭Windows功能 4.勾选Windows虚拟机监控程序平台 5.接下来重启电脑…...
2023年中国自动驾驶卡车市场发展趋势分析:自动驾驶渗透率快速增长[图]
自动驾驶卡车的技术原理是通过电脑算法控制车辆行驶,辅助驾驶员完成任务。其实现方式主要是基于传感器和计算处理技术。自动驾驶卡车可以随时感知周围环境,灵活避障,自适应调整行驶路径,相比之下传统卡车需要驾驶员进行手动操作&a…...
力扣第17题 电话号码的字母组合 c++ 回溯 经典提升题
题目 17. 电话号码的字母组合 中等 相关标签 哈希表 字符串 回溯 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。…...
华纳云:怎么判断VPS的ip是不是公网ip
要判断一个VPS的IP地址是否为公网IP,您可以执行以下步骤: 查看IP地址: 首先,获取您的VPS的IP地址。您可以使用以下命令来查看VPS的IP地址: curl ifconfig.me 或 curl ipinfo.io/ip 这些命令将显示VPS的公网IP地址。 检…...
QT学习笔记1-Hello, QT
1. QT环境 1.1 QT_CREATOR QT的集成开发工具,可以进行项目的创建运行。有一些实例可以运行之。 1.2 QT_ASSISTANT QT的工具书 2. 核心的概念 2.1 windows 窗口 2.2 widget 组件放置在窗口上的 2.3 bar 栏 2.4 icon 图标 3. Hello, QT 3.1 main.cpp …...
水滴卡片效果实现
效果展示 CSS 知识点 border-radius 属性运用 FANCY-BORDER-RADIUS 工具 此工具主要是实现不规则的图形。 FANCY-BORDER-RADIUS 工具地址 页面整体布局实现 <div class"container"><div class"drop" style"--clr: #ff0f5b">&l…...
【算法题】2899. 上一个遍历的整数
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一个下标从 0 开始的字符串数组…...
Python+unittest+requests接口自动化测试框架搭建 完整的框架搭建过程
首先配置好开发环境,下载安装Python并下载安装pycharm,在pycharm中创建项目功能目录。如果不会的可以百度Google一下,该内容网上的讲解还是比较多比较全的! 大家可以先简单了解下该项目的目录结构介绍,后面会针对每个文…...
系统架构设计:19 论数据挖掘技术的应用
目录 一 数据挖掘技术 1 数据挖掘的分类 2 数据挖掘的主要方法 一 数据挖掘技术 从技术角度看,数据挖掘可以定义为从大量的、不完全的、有噪声的、模糊的、随机的实际数据中提取隐含在其中的、人们不知道的、但又潜在有用的信息和知识的过程。</...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
Spring事务传播机制有哪些?
导语: Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有…...
迁移科技3D视觉系统:重塑纸箱拆垛场景的智能革命
一、传统拆垛场景的困局与破局之道 在汽车零部件仓库中,每天有超过2万只异形纸箱需要拆垛分拣。传统人工拆垛面临三大挑战: 效率瓶颈:工人每小时仅能处理200-300件,且存在间歇性疲劳安全隐患:20kg以上重箱搬运导致年…...
