利用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 }