首页 > 其他分享 >利用Mybatis拦截器实现自定义的ID自增器

利用Mybatis拦截器实现自定义的ID自增器

时间:2024-01-29 10:33:26浏览次数:33  
标签:拦截器 自定义 spring 自增器 boot 模块 Mybatis ID

原生的Mybatis框架是没有ID自增器,但例如国产的Mybatis Plus却是支持,不过,Mybatis Plus却是缺少了自定属性的填充;例如:我们需要自定义填充一些属性,updateDate、createDate等,这时Mybatis Plus自带的ID自增器就无法满足需求;这种时候我们就需要自定义的ID增加器,可以自定义ID增长策略同时还得支持更多的属性自定义扩展,当然,最好能做成插件形式为其他项目或者模块提供引入那就更新好了。

在开始之前我们先确定和分析主要的需求,了解了需求才能更好的制作

首先我们得确定主要的宗旨那就是实现ID自增长器,同时,还等保证该增长的灵活性和扩展性,让其他项目引入之后可以很灵活的更改增长策略,随意替换ID增长的实现。主要需求为下列几点:

  1. 自定义的ID增长策略,同时保证该特性灵活性可以随意替换
  2. 支持自定义的附带属性扩展增强
  3. 保证其他的项目引起使用时的绝对简单,最好能像Spring Boot自动装配模块一样保证简单

确定需求之后我们现在开始根据需求来功能了,我们由外到内、由粗到细的去实现整个模块。

先确定该模块的外体特征,先看第3点

保证其他的项目引起使用时的绝对简单,最好能像Spring Boot自动装配模块一样保证简单

要保证该模块的引用使用简单那么就必须使用Spring Boot的特性->自动配置,实现自定义场景装配器,利用该场景装配才能保证模块可以自动配置完成启动之初的初始化。

我们先来新建Maven模块

这里的模块命名最好遵循Spring Boot官方的建议,第三方的模块命名由模块名称+spring-boot;官方模块由spring-boot+模块名称

建好模块之后我们来整理下目录

这里我们把多余的目录、文件删除,这里使用了Maven的初始化模板,会自动生成一些模板文件;但是,该操作的主要目的只是获得一个Maven结构的项目

接下来确定POM文件的引用

 1   <!-- springboot自动配置-->
 2         <dependency>
 3             <groupId>org.springframework.boot</groupId>
 4             <artifactId>spring-boot-autoconfigure</artifactId>
 5         </dependency>
 6 
 7         <!-- springboot自动配置处理器-->
 8         <dependency>
 9             <groupId>org.springframework.boot</groupId>
10             <artifactId>spring-boot-configuration-processor</artifactId>
11             <optional>true</optional>
12         </dependency>
13 
14         <!-- mybatis启动器,本质是在Mybatis的基础上进行扩展的,必须引入Mybatis的支持-->
15         <dependency>
16             <groupId>org.mybatis.spring.boot</groupId>
17             <artifactId>mybatis-spring-boot-starter</artifactId>
18             <version>2.2.2</version>
19         </dependency>

到这里整个模块的创建已经完成了,接下来我们的仔细分析下该如何实现自定义的增长器

 插件要使用方便那么就意味着要抛弃繁杂的配置,同时对必要的信息注入配置时应该采用注解的方式来保持简洁;

既然是ID增长器那就必须的确定哪个属性为ID,并且确定ID属性的类的全限定名,在这里我们定义两个注解

1、这里定义了@Key注解,该注解的主要目的是为了标识出ORM实体类映射数据库表中的主键,插件最终的主要注入的属性

 1 /**
 2  * 主键注解标记
 3  * @Author: Song L.Lu
 4  * @Since: 2024-01-18 11:20
 5  **/
 6 
 7 @Documented
 8 @Retention(RetentionPolicy.RUNTIME)
 9 @Target({ElementType.FIELD})
10 public @interface Key {
11     String value() default "";
12 }

2、@KeyGenerator 注解,用来标记当前的实体类所在的包路径,该路径为插件提供查找实体类的路径;注意该注解标记于Spring Boot启动主类上

格式@KeyGenerator ("xxx.xx.xx.entity")

 1 /**
 2  * 标记当前实体类所在的包路径
 3  * @Author: Song L.Lu
 4  * @Since: 2024-01-18 11:19
 5  **/
 6 
 7 @Documented
 8 @Retention(RetentionPolicy.RUNTIME)
 9 @Target({ElementType.TYPE})
10 public @interface KeyGenerator {
11     String value();
12 }

 

标签:拦截器,自定义,spring,自增器,boot,模块,Mybatis,ID
From: https://www.cnblogs.com/Tegra/p/17993916

相关文章

  • 自定义httpServletRequestWrapper导致上传文件请求参数丢失
    问题背景项目是SpringBoot单体式,在项目中,为了实现调用controller请求的日志记录功能。因此做了以下配置:创建自定义拦截器LogInterceptor;因为需要使用到流获取请求参数,解决流只能读一次问题,所以需要自定义HttpServletRequestWrapper;需要使得自定义HttpServletRequestW......
  • firefox 怎么自定义搜索引擎
     后面使用的时候,发现Firefox不能自定义搜索引擎了。从baidu、知乎上面搜索的结果,大部分都是打非所问的,不知道偏到哪里了。从stack上面找到的答案,记录一下 1、地址栏打开about:config2、搜索browser.urlbar.update2.engineAliasRefresh3、点击右侧的+4、现在,当您转到“......
  • vue3使用自定义指令实现图片懒加载
    //自定义指令app.directive('lazy',{mounted(el,binding){//绑定的元素,绑定的值//IntersectionObserver可以用来自动监听元素是否进入了设备的可视区域之内,而不需要频繁的计算来做这个判断constobserve=newIntersectionObserver(([{isIntersec......
  • 自定义路由事件
    路由事件相比.NET事件的优点为在最合适的位置编写紧凑的、组织良好的用于处理事件的代码提供了灵活性。Xaml无限套娃的树状结构,可以简单的在逻辑树上堆砌出定制按钮,而不必像Winform那样,动不动就要大费周章的自定义控件,比如带文字和图片的按钮,这时候,路由事件支持在父级控件上解......
  • [office] Excel中2010版使用自定义名称简化计算公式的操作技巧
    假设企业申报工资基数为员工的基本工资,用户可将“基本工资”所在单元格区域命名为“申报工资基数”,今天,小编就教大家在Excel中2010版使用自定义名称简化计算公式的操作技巧。Excel中2010版使用自定义名称简化计算公式的操作步骤选择“定义名称”选项,在“员工基本信......
  • 自定义对象比较器,结果失真怎么办?
    如果自定义对象比较器的结果失真,那么首先需要确认比较器的compare方法是否正确实现。在Java中,compare方法应该返回一个负整数、零或正整数,分别表示第一个参数小于、等于或大于第二个参数。例如,如果我们正在比较两个Student对象,我们可能会根据他们的身高或年龄来排序。但是,如果我......
  • 为了生成latex如何在sympy中自定义向量函数?适用于自定义类的latex生成。
    在sympy.printing.Printer的_print函数中可以看到一个hook,使得对于每一个类都会尝试寻找对应的_print_{class}函数来处理,因此我们只要利用好这个hook就可以为自定义类创建latex生成逻辑,我试图创建了一个_print_BoldUndefinedFunction函数,但发现它捕获不到(其实是因为BoldUndefinedF......
  • WPF,ListView中的Item自定义靠左还是靠右
    Item中有属性来决定是左还是右,难点在于如何将ItemTemplate扩充占满整个宽度,这样子当界面缩放的时候,Item靠左或靠右也能随着移动,其实主要是下面的代码,设置ListViewItem的HorizontalContentAlignment属性为Stretch,铺满整个宽度,示例代码如下:<ListViewx:Name="LvmqttMsg"Ba......
  • 记windows自定义bat脚本自启动
    自定义Windows启动脚本简化版在本指南中,我们将使用一个简化的批处理文件(.bat)来演示如何创建自定义的Windows启动脚本。以下是一个基本的模板,您只需根据需要在:begin部分添加您的代码。 @echooffif"%1"=="h"gotobeginrem获取脚本路径set"scriptPath=%~dp0"......
  • Flutter3 TV 一百行自定义实现 tabbar tabview 联动
    系统自带的tabbar焦点在TV端无法很好的使用使用card_swiper组件作为tabviewimport'package:card_swiper/card_swiper.dart';import'package:flutter/material.dart';voidmain()=>runApp(MyApp());classMyAppextendsStatefulWidget{constMyApp({su......