springboot~mybatis-plus的DynamicTableNameInnerInterceptor实现分表

超轻量级

DynamicTableNameInnerInterceptor是mybatis-plug的一个拦截器插件,可以自己定义需要拦截的表单,然后对它进行加工,这时mybatis-plus就会把SQL代码的表名加上你的这个装饰。

封装的思想

我们通常把mybatis做成一个包,公司其它同事直接使用咱们的包,包里会统一定义数据基类数据分页数据脱敏、审计字段填充等特性,开发人员不需要关注这些内容,这些内容会被自己注册;或者人开发人员可以直接继承它们,直接使用即可。

  • 插件注册器
@Configuration
public class MybatisPlusConfig implements ApplicationContextAware {

	ApplicationContext applicationContext;

	/**
	 * 拦截器
	 */
	@Bean
	public MybatisPlusInterceptor mybatisPlusInterceptor() {
		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
		// 分页插件, 对于单一数据库类型来说,都建议配置该值,避免每次分页都去抓取数据库类型
		interceptor.addInnerInterceptor(new LindPaginationInnerInterceptor());
		// 防止全表更新与删除
		interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
		// 加载个性化的分表配置,它可能是用户在当前项目定义的,然后我们统一对它们进行装配
		Optional.ofNullable(applicationContext.getBeanNamesForType(DynamicTableNameInnerInterceptor.class))
				.ifPresent(o -> {
					for (String beanName : o) {
						DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = applicationContext
								.getBean(beanName, DynamicTableNameInnerInterceptor.class);
						interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
					}
				});
		return interceptor;
	}
.....
}

通过上面的代码我们知道,在外部定义的DynamicTableNameInnerInterceptor对象,会被自动的注册到mybatis-plus的组件中,开发人员在具体项目里不需要再次注册。

  • 开发人员在项目中定义一个t_log表,按时间进行分表
	@Bean
	public DynamicTableNameInnerInterceptor tableNamePlusInterceptor() {
		DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
		HashMap<String, TableNameHandler> map = new HashMap<String, TableNameHandler>();

		map.put("t_log", new DaysTableNameParser());

		dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
		return dynamicTableNameInnerInterceptor;
	}

代码的测试

	@Test(expected = BadSqlGrammarException.class)
	public void insertLog() {
		TLog log = new TLog();
		log.setMessage("测试");
		logDao.insert(log);
	}

生成的sql代码如下

[main] DEBUG com.lind.mybatis.dao.LogDao.insert - ==>  Preparing: INSERT INTO t_log_20230524 ( id, message, create_by, create_time, update_by, update_time, del_flag ) VALUES ( ?, ?, ?, ?, ?, ?, ? )

需要注意的是,无论是sharding-jdbc还是mybatis-plus-DynamicTableNameInnerInterceptor组成的分表,咱们都需要提前把数据表建立出来,他们这些组件是不会自动建表的。

作者:仓储大叔,张占岭,
荣誉:微软MVP
QQ:853066980

支付宝扫一扫,为大叔打赏!

本文转载于网络 如有侵权请联系删除

相关文章

  • UART协议详解

    大家好,又见面了,我是你们的朋友全栈君。UART使用的是异步,串行通信。串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。 异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。 数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。 数据通信格式如下图: 其中各位的意义如下: 起始位:先发出一个逻辑”0”信号,表示传输字符的开始。 数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验) 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。 注:异步

  • max31865C语言程序,max31865温度传感器通信驱动代码「建议收藏」

    大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说max31865C语言程序,max31865温度传感器通信驱动代码「建议收藏」,希望能够帮助大家进步!!!最近研究maximmax31865温度传感器,贴出通信驱动代码和大牛门一起学习,指点我一二max31865是专门用来测量电阻类温度传感器的,ad分辨率为15位,可以做PT100高精度测量,通信接口为SPI。通过评估板CN7的PC10,PC11,PC12(SPI3)连接芯片模块,PD2做片选。下面贴上驱动代码:1.// 2.// 3. 4.SPI_HandleTypeDefSPI3_Handler; 5. 6.voidSPI3_Init(void) 7.{ 8.SPI3_Handler.Instance=SPI3;//SP3 9.SPI3_Handler.Init.Mode=SPI_MODE_MASTER;//设置SPI工作模式,设置为主模式 10.SPI3_Handler.Init.Direction=SPI_DIRECTION_2LINES;//设置SPI单向或者双向的数据模式:SPI设置为双线模式 11.SPI3_Han

  • C#操作MySql数据库范例代码

    首先到网上下载MySql.Data.MySqlClient.dll,然后添加引用到项目usingMySql.Data.MySqlClient; stringconnectString=@"server=localhost;userid=root;password=xxx;database=sharejs";/*由于我的数据库在本地就用localhost了,可以替换成IP地址*/ MySqlConnectionconn=newMySqlConnection(connectString); conn.Open(); MySqlCommandcmd=conn.CreateCommand(); cmd.CommandText="select*frominfo"; cmd.CommandType=CommandType.Text; using(MySqlDataReaderreader=cmd.ExecuteReader()) { while(reader.Read()) Console.WriteLine(reader[0].ToSt

  • 5分钟配置好你的AI开发环境

    参考链接:人工智能环境作者|Revolver 无论是第一次设置TensorFlow的新手数据科学爱好者,还是使用TB级数据的经验丰富的AI工程师,安装库、软件包或者框架总是一个困难又繁琐的过程。但是像Docker这样的集装箱化工具正在彻底改变着软件的可重复性,只不过它们还没有在数据科学和人工智能社区中流行起来。但随着机器学习框架和算法的不断发展,我们将很难花时间专注于学习所有相关的开发人员工具,尤其是那些与模型构建过程没有直接关联的工具。 在这篇文章中,我将展示如何使用docker和python工具包datmo为任何流行的数据科学和AI框架快速配置环境。 一.Docker 1.docker是什么 该软件于2013年由dotCloud公司推出,发布以来一直备受关注和讨论,被认为可能会改变软件行业。 2.为什么使用docker 如果让你说出软件开发最烦人的事情,那么环境配置必然是其中之一。例如开始编写Python应用程序,那么你的第一个步骤就是在您的计算机上安装Python。软件运行时,你不仅需要让自己计算机上的环境需适合你的应用程序按预期运行,并且还需要与生产环境相匹配。这就是所谓的环境

  • 机器学习25:概率图--条件随机场(CRF)

    1,条件随机场(ConditionalRandomField):条件随机场是给定随机变量X条件下,随机变量Y的马尔可夫随机场。条件随机场与马尔科夫随机场均使用团上的势函数定义概率,两者在形式上没有显著区别;但条件随机场处理的是条件概率,而马尔可夫随机场处理的是联合概率,这是两者的本质差异。对于上图链式条件随机场来讲,使用势函数和图结构上的团来定义条件概率P(y|x)。如下:其中,Z为规范化因子(也称为归一化项):另外,sk(x,yt)为状态特征,依赖于当前位置,一般和位置t相关;tj(x,yt,yt+1)为转移特征,一般可以简化为f2(yt,yt+1)并使用状态转移矩阵来表示,依赖于当前和前一个位置。2,特征函数:要使用条件随机场,需要定义合适的特征函数。特征函数通常是实值函数,以刻画数据的一些很可能成立或期望成立的经验特征。以上图词性标注任务为例,若采用转移特征函数如下:则表示第i个观测值xi为单词“knock”时,相应的标记yi和yi+1很可能分别为[V]和[P]。若采用状态特征函数如下:则表示观测值xi为单词“knock”时,它所对应的标记很可能为[V]。 条件随机场是一种判别式

  • NVIDIA Titan RTX帮助研究人员更快速检测骨质疏松症(附代码)

    达特茅斯学院的一个研究小组在将他们的TitanXpGPU换成TitanRTX之后,报告了有希望的结果。在新的GPU上运行他们现有的代码,当训练一对神经网络来检测骨质疏松性椎体骨折时,他们的性能提高了80%。最上面一行显示四个例子从CTs被识别为ovf阳性CNN/LSTM分类方法在胸椎骨折(a和b)和腰椎(c和d)。彩色地图底部行突出显示区域与这些分类输出模式密切相关。他们的研究员在Github上说到:“训练深度学习模型需要强大的硬件资源,如图形处理单元卡(GPU)。考虑到我们实验室当前计算需求的增长,我们最近购买了NVIDIATITANRTXGPU卡,这是目前市场上最强大的GPU卡。”达特茅斯哈桑普实验室由人工智能研究员赛义德哈桑普(SaeedHassanpour)领导,帮助生物医学研究人员和临床医生进行数据分析、医学诊断和实践。为了评估新的GPU性能,团队将TITANXp与新一代TITANRTXGPU进行了比较。“我们在CT图像数据集上对我们提出的深度神经网络(CNN+LSTM)进行了训练,以自动检测骨质疏松性椎体骨折,就像我们在2018年的论文中展示的那样,”该团队说。研究人员说,

  • 【资讯】7个图告诉你IBM100年来变了什么,不变的是什么

    现在提起IBM,你会想到什么?很可能是ThinkPad电脑或者打败象棋世界冠军的深蓝计算机。自从2005年剥离个人电脑业务后,我们越来越少在生活里看到IBM的痕迹。取而代之的则是偶尔在杂志上瞥到的广告语,诸如“智慧地球”、“智慧的计算始于云端”之类让人有些疑惑的标语。此外出现最多的可能就是卖业务的新闻,继今年一月IBM把x86服务器业务卖给联想后,又几次传出它希望尽快脱手芯片业务的消息——就是苹果电脑和微软Xbox360游戏机一度依赖的处理器。彭博社本周爆料称IBM甚至愿意为交易倒贴10亿美元,只为早日甩开这个亏损多年的部门。 IBM今天到底是做什么的?100多年来它有什么变化?下面的信息图帮你回溯IBM的历史,从1911到2014。1. IBM:国际·商业·机器IBM今天的全称是国际商业机器股份有限公司,但它刚开始的时候叫CTR(计量-制表-计时公司)。当托马斯·沃森接手CTR后,在1924年将公司的名字改成IBM,源于他希望整合公司业务,让公司更国际化的野心。今天,国际、商业和机器仍然是IBM的关键词:2. 100年前的IBM在做什么?尽管IBM在人们的记忆中是以各种前沿科技闻名,

  • 用WPF做一个简易浏览器

    微软的WPF(WindowsPresentationFoundation)是目前Windows平台上最好用的图形界面框架了。如果想在Windows平台上编写图形界面程序,而且没有跨平台且性能需求比较高,而且对C#语言比较熟悉,那么WPF就是最适合你的了。WPF虽然出来也有大概十来年了,但是它的很多设计思想还是非常先进的,配合C#这门语言的话更加顺手。WPF的界面设计和程序功能完全解耦,也就是说设计界面和编写程序功能可以互不干扰的同时进行。好了,废话不多说,下面直接开始吧。当然需要说明,这篇文章不是讲如何实现浏览器的,而是利用WPF的一个浏览器控件,让大家了解一下WPF的一些简单功能。由于WPF组件庞大,没办法在一篇文章中详细介绍。所以如果大家通过这篇文章对WPF有了一些兴趣,那么这篇文章的目的就达到了。先来看看效果图吧。当然功能比较简陋,只有前进、后退、刷新几个功能。当然如果太复杂,就没办法在一篇文章中说完了。界面设计布局不管是什么图形界面框架,首先讨论的都是界面布局了。布局负责组织界面元素如何排列和显示。合适的界面布局可以降低我们程序界面的复杂度。如果需要了解布局的话,可以看看这篇英

  • javascript性能优化_javascript框架是什么

    大家好,又见面了,我是你们的朋友全栈君。即使是循环中最快的代码,累计迭代上千次也会慢下来。此外,循环体运行时也会带来小性能开销,不仅仅是增加了总体运行时间。减少迭代次数能获得更加显著的性能提升,最广为人知的一种限制循环迭代次数的模式被称为“达夫设备(Duff’sDevice)”。Duff’sDevice是一种循环体展开技术,它使得一次迭代中实际执行了多次迭代的操作。一个典型的实现如下:<scripttype="text/javascript"> variterations=Math.floor(items.length/8), startAt=items.length%8, i=0; do{ switch(startAt){ case0:process(items[i++]); case7:process(items[i++]); case6:process(items[i++]); case5:process(items[i++]); case4:process(items[i++]); case3:process(items[i++]); case2

  • CMMI 第十四章读书报告

                 本章重点:   系统实现与测试过程简述   编码流程   测试流程   缺陷管理与改错         系统实现与测试过程简述       编码流程 工作准备+编码活动   测试流程 单元测试: 在设计过程中,整个系统被细分成为许多模块或类,这里可以把模块或单元理解为单元。在每个单元的接口,数据结构与算法都已经设计及完成,编码成功后,执行单元测试。 单元测试采用白盒测试或黑盒测试都可以。   集成测试: 集成测试是单元测试是单元测试的逻辑拓展。 集成测试在单元测试的基础上,测试在将所有的软件单元按照概要设计规格说明的要求组装成模块,子系统或系统的过程各部分工作是否达到或实现相应技术指标及要求的活动。   缺陷管理与改错 如果在测试时发现了缺陷,开发人员应当尽早消除缺陷,并且需要对缺陷的全生命周期进行详细的跟踪及管理。通常缺陷管理与改错的指导原则如下:

  • Impala &amp; Hive 使用复杂数据类型

    1.环境 CDH5.16.1 2.Hive使用复杂数据类型 2.1数据格式 1zhangsan:manfootball,basketball 2lisi:femalesing,dance 复制 2.2Hive建表 createtablestudentInfo( idint, infomap<string,string>comment'map<姓名,性别>', favoritearray<string>comment'array[football,basketball]' ) rowformatdelimitedfieldsterminatedby'\t'--列分隔符 collectionitemsterminatedby','--array中各个item之间的分隔符 mapkeysterminated by':'--map中key和value之间的分隔符 linesterminatedby'\n';--行分隔符 复制 2.3导入数据 loaddatalocalinpath'/opt/module/jobs/student.txt'intotables

  • docker 安装火狐和火狐驱动

    直接上命令 第一步:下载火狐浏览器和驱动 版本号firefox-89.0.tar.bz2 火狐驱动:https://github.com/mozilla/geckodriver/releases geckodriver-v0.31.0-linux64.tar.gz 第二步进入docker镜像, dockerexec-itd3be8856e1d8/bin/bash 第三步卸载原来Firefox apt-get--purgeremovefirefox 第四步安装firefox firefox-89.0.tar.bz2 将解压后的文件夹firefox移动到/opt下 tarjxvffirefox-89.0.tar.bz2-C/opt chown-Rroot:root/opt/firefox 创建链接:sudoln-s/opt/firefox/firefox/usr/bin/firefox 创建桌面快捷方式:进入/usr/share/applications,touchfirefox.desktop 添加内容: [DesktopEntry] Name=firefox Comm

  • Furion分表分库我也要happy coding

    Furion分表分库集成ShardingCore ShardingCore ShardingCore易用、简单、高性能、普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2+的所有版本,支持efcore2+的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款组件,如果你喜欢这组件或者这个组件对你有帮助请点击下发star让更多的.neter可以看到使用 GithubStar助力dotnet生态GiteeStar 注意:建议使用ShardingCore6+efcore版本随意如果是Sharding6以上的版本请移步.Net下极限生产力之分表分库全自动化MigrationsCode-First 背景 随着.net6的发布,陆陆续续的框架都已经开始支持了,ShardingCore也不例外,为了推动.net生态,也为了让更多的的人了解.net下其实也有分表分库的解决方案,所以打算写一篇关于ShardingCore集成到其他框架的思路。 Fourin框架大家应该也是比较清楚的,作者也是一个乐于开源有着开源精神的人,秉着大家都是热爱开源的所以决定

  • 动画-复制层(CAReplicatorLayer)

    复制层(CAReplicatorLayer) 对于下面的效果大家是否有实现思路? 有些人可能要说:老夫撸起袖子,敲键盘就是干,不需要手势交互,那么直接用5个CALayer,处理不同的位置以及定时器、透明度等等,貌似很简单。 不不不,今天要带出来的主题是CAReplicatorLayer 1、CAReplicatorLayer /*Thereplicatorlayercreatesaspecifiednumberofcopiesofits sublayers,eachcopypotentiallyhavinggeometric,temporaland colortransformationsappliedtoit. * Note:theCALayer-hitTest:methodcurrentlyonlyteststhefirst instanceofzreplicatorlayer’ssublayers.Thismaychangeinthe future.*/ 官方给出的意思就不翻译了,使用场景大致是一个形状、特性差不多的layer,我们

  • 悬浮窗的另外一种使用

    转自:http://blog.csdn.net/shinay/article/details/7783276 下面是创建悬浮窗的方法: [java] viewplain copy   private boolean isAdded = false; // 是否已增加悬浮窗   private static WindowManager wm;   private static WindowManager.LayoutParams params;   private Button btn_floatView;     [java] viewplain copy   /**   * 创建悬浮窗   */   priv

  • Cypress UI/API测试的使用参考

    官网的深入示例 https://docs.cypress.io/examples/examples/recipes.html   类别 地址和备注 workshop https://docs.cypress.io/examples/examples/workshop.html#End-to-end-Testing-with-Cypress-io   https://github.com/cypress-io/testing-workshop-cypress 这里有初中高级别的学习说明。包含一步步如何把工程等做出来的 Recipes https://docs.cypress.io/examples/examples/recipes.html#Fundamentals 各种技术点的菜单式讲解 视频 https://docs.cypress.io/examples/examples/tutorials.html 需要FQ Applications https://docs.cypress.io/exam

  • 常用jstl

    1求list中某一值的和 2<c:setvar="total"value="${0}"/> 3<c:forEachvar="tList"items="${order}"> 4<c:setvar="total"value="${total+tList.amount}"/> 5</c:forEach> 6<c:outvalue="${total}"/>复制  

  • 哈希表/散列表 指针版模版

    #include<cstdio> #include<cstring> #include<cstdlib> #include<vector> #include<algorithm> usingnamespacestd; constintN=2010; constintM=10010; typedeflonglongLL; constintSIZE=100003; constintSEED=13333; structNode{ LLkey; inttype; Node*next; Node*set(LL_key,Node*_next){ key=_key;next=_next;type=-1; returnthis; } }; NodeBase[SIZE]; structHash{ Node*H[SIZE],*cur; intmark[N],cmark; voidclear(){ cur=Base; cmark++; } Hash(){ memset(mark,0,sizeof(mark)); cmark=0; } in

  • 3. 数组的响应式原理

    数组的响应式原理 一般使用数组很少使用arr[1]=100,arr.length=10这两种方式修改数组,vue2同样也不支持 vue2中实现数组响应式的方法是重写能改变数组的7个方法 特殊情况:形如:arr:[1,2,3,{num:100}],这种数组里面有嵌套对象的,也要能劫持对象的属性,添加get和set 特殊情况2:arr:[1,2,3],arr.push({num:20}),在能改变数组的方法中,如push一个对象,那这个对象的属性也需要被劫持 上述为本章需要实现的目标 新建文件dist/2.array.html文件,内容如下 <!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <metahttp-equiv="X-UA-Compatible"content="IE=edge"> <metaname="viewport"content="width=device-width,initial-scale=1.0"> <titl

  • C#实现——十大排序算法之选择排序

    选择排序法 1.工作原理(算法思路) 给定一个待排序数组,找到数组中最小的那个元素 如果最小元素不是待排序数组的第一个元素,则将其和第一个元素互换 在剩下的元素中,重复1、2过程,直到排序完成。 2.动图演示 3.C#代码实现 根据原理设计算法: classProgram { //选择排序法 privatestaticvoidchooseSort(int[]array) { //第一个for循环:每一次循环完成后得到的当前的最大元素都与第i位做交换 for(inti=0;i<array.Length;i++) { //min为最小元素的索引 intmin=i; //第二个for循环:将当前的array[j]与array[min]作比较,如果array[j]更小,则替换min的当前索引 for(intj=i+1;j<array.Length;j++) { if(array[min]>array[j]) { min=j; } } //当第二个for循环完成时,array[min]中存储的就是当前最小元素 //将array[min]与array[i]交换 intt

  • vscode远程开发

    1.在拓展插件中搜索“remote-SSH”插件,点击安装 2.按“ctrl+shift+p”快捷键搜索“Remote-SHH:AddNewSShHost...”指令  3.输入主机名,例如:root@47.105.178.123,点击回车  4.选择要配置的文件,这个根据个人喜好随便选,我选择第一个  5.按“ctrl+shift+p”快捷键搜索“Remote-SHH:ConnecttoHost...”指令,选择刚刚添加的主机  6.输入密码点击回车    7.选择主机的操作系统  8.连接上以后,点击左侧的"打开文件夹"按钮,选择要操作的目录即可。  

相关推荐

推荐阅读