dromara/mybatis-plus-ext 自动填充功能详解

dromara/mybatis-plus-ext 自动填充功能详解

【免费下载链接】mybatis-plus-ext mybatis-plus框架的拓展包,在框架原有基础上做了进一步的轻度封装,增强内容:免手写Mapper、多数据源自动建表、数据自动填充、自动关联查询、冗余数据自动更新、动态查询条件等。 【免费下载链接】mybatis-plus-ext 项目地址: https://gitcode.com/dromara/mybatis-plus-ext

本文详细介绍了dromara/mybatis-plus-ext中的自动填充功能,包括其设计思路、实现细节、注解驱动的填充逻辑、自定义填充处理器开发以及实际应用案例。自动填充功能通过注解驱动的方式,允许开发者在数据库操作时自动填充字段值,如创建时间、更新时间或操作人信息,从而减少重复代码并提高开发效率。

自动填充功能的设计与实现

自动填充功能是 dromara/mybatis-plus-ext 中的一个重要特性,它允许开发者在数据库操作时自动填充某些字段的值,例如创建时间、更新时间或操作人信息。这种功能不仅减少了重复代码,还提高了开发效率和数据一致性。本节将深入探讨自动填充功能的设计思路和实现细节。

设计思路

自动填充功能的核心设计目标是通过注解驱动的方式,实现对字段的自动填充。其设计思路主要包括以下几点:

  1. 注解驱动:通过自定义注解标记需要自动填充的字段,例如 @AutoFill
  2. 填充策略:支持多种填充策略,如插入时填充、更新时填充或两者都填充。
  3. 动态值获取:支持从上下文(如当前用户信息)动态获取填充值。
  4. 扩展性:允许开发者自定义填充逻辑,以满足复杂业务场景的需求。

以下是一个简单的类图,展示了自动填充功能的核心组件:

mermaid

实现细节

1. 注解定义

自动填充功能的核心是 @AutoFill 注解,它用于标记需要自动填充的字段。以下是注解的定义:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AutoFill {
    String value() default "";
    FillStrategy strategy() default FillStrategy.INSERT_UPDATE;
}
  • value:用于指定填充值的来源,例如从上下文获取用户 ID。
  • strategy:指定填充策略,支持插入时填充、更新时填充或两者都填充。
2. 填充处理器

填充处理器 AutoFillHandler 负责根据注解配置生成填充值。开发者可以通过实现 AutoFillHandler 接口来自定义填充逻辑:

public interface AutoFillHandler {
    Object getFillValue(AutoFill autoFill);
}

例如,以下是一个简单的实现,用于填充当前时间:

public class CurrentTimeFillHandler implements AutoFillHandler {
    @Override
    public Object getFillValue(AutoFill autoFill) {
        return new Date();
    }
}
3. 拦截器实现

自动填充功能通过拦截器在数据库操作时触发。拦截器会扫描实体类中的 @AutoFill 注解,并根据策略调用填充处理器:

public class AutoFillInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object entity = invocation.getArgs()[0];
        // 扫描实体类中的 @AutoFill 注解并填充值
        fillAutoFillFields(entity);
        return invocation.proceed();
    }
}
4. 示例代码

以下是一个完整的示例,展示了如何使用自动填充功能:

public class User {
    @AutoFill(strategy = FillStrategy.INSERT)
    private Date createTime;

    @AutoFill(strategy = FillStrategy.INSERT_UPDATE)
    private Date updateTime;

    @AutoFill(value = "currentUser", strategy = FillStrategy.INSERT)
    private String createBy;
}

// 配置填充处理器
AutoFillHandlerRegistry.register("currentUser", new CurrentUserFillHandler());
AutoFillHandlerRegistry.register("default", new CurrentTimeFillHandler());

表格:填充策略说明

策略类型描述
INSERT仅在插入操作时填充字段
UPDATE仅在更新操作时填充字段
INSERT_UPDATE在插入和更新操作时均填充字段

流程图:自动填充流程

mermaid

通过以上设计和实现,自动填充功能为开发者提供了一种高效、灵活的方式来处理字段填充需求,显著提升了开发效率和数据一致性。

注解驱动的填充逻辑

Mybatis-Plus-Ext(MPE)的自动填充功能通过注解驱动的方式实现,开发者可以通过简单的注解配置,实现字段的自动填充。本节将详细介绍这些注解的使用方式及其背后的逻辑。

核心注解

MPE提供了多种注解来支持不同类型的自动填充需求:

  1. @InsertFillData:用于标记在插入操作时需要自动填充的字段。
  2. @UpdateFillData:用于标记在更新操作时需要自动填充的字段。
  3. @InsertUpdateFillData:用于标记在插入和更新操作时均需要自动填充的字段。
  4. @FillTime:用于标记时间类型的字段,支持插入或更新时自动填充当前时间。
  5. @DefaultValue:用于为字段设置默认值。

以下是一个简单的代码示例,展示如何使用这些注解:

public class User {

    @InsertFillData
    private String createdBy;

    @UpdateFillData
    private String updatedBy;

    @InsertUpdateFillData
    private String status;

    @FillTime(format = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    @DefaultValue("active")
    private String accountStatus;
}

填充策略

MPE的填充逻辑由AutoFillMetaObjectHandler类实现,该类继承自Mybatis-Plus的MetaObjectHandler。以下是其核心方法:

  1. insertFill:处理插入操作时的自动填充。
  2. updateFill:处理更新操作时的自动填充。
  3. fill:通用的填充逻辑,根据注解类型和操作类型动态填充字段。

以下是一个填充逻辑的流程图:

mermaid

自定义填充逻辑

开发者可以通过实现AutoFillHandler接口来自定义填充逻辑。例如,以下代码展示了如何为createdBy字段填充当前登录用户的信息:

public class CustomFillHandler implements AutoFillHandler {

    @Override
    public String getVal(Object object, Class<?> clazz, Field field) {
        if (field.isAnnotationPresent(InsertFillData.class)) {
            return SecurityContext.getCurrentUser();
        }
        return null;
    }
}

时间填充的特殊处理

对于时间类型的字段,MPE提供了@FillTime注解,支持动态填充当前时间。开发者可以通过format属性指定时间格式:

@FillTime(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

总结表格

注解作用范围描述
@InsertFillData插入操作标记插入时需要填充的字段
@UpdateFillData更新操作标记更新时需要填充的字段
@InsertUpdateFillData插入和更新操作标记插入和更新时均需填充的字段
@FillTime时间字段动态填充当前时间
@DefaultValue所有操作为字段设置默认值

通过以上注解和逻辑,MPE的自动填充功能可以极大地简化开发工作,提升代码的可维护性和一致性。

自定义填充处理器开发

Mybatis-Plus-Ext(MPE)的自动填充功能提供了强大的灵活性,允许开发者通过自定义填充处理器来满足特定业务需求。本节将详细介绍如何开发自定义填充处理器,并通过代码示例和流程图展示其实现过程。

1. 理解填充处理器接口 AutoFillHandler

AutoFillHandler 是 MPE 中用于自定义填充逻辑的核心接口,定义如下:

public interface AutoFillHandler<Type> {
    Type getVal(Object object, Class<?> clazz, Field field);
}
  • 泛型参数 Type:表示填充值的类型(如 StringDate 等)。
  • 方法 getVal:实现具体的填充逻辑,返回填充值。

2. 实现自定义填充处理器

以下是一个简单的自定义填充处理器示例,用于自动填充用户部门名称:

import org.dromara.mpe.autofill.annotation.handler.AutoFillHandler;

public class DeptNameAutoFillHandler implements AutoFillHandler<String> {
    public static final String deptName = "技术部";

    @Override
    public String getVal(Object object, Class<?> clazz, Field field) {
        return deptName;
    }
}
关键点:
  1. 实现 AutoFillHandler 接口:指定泛型类型为 String
  2. 填充逻辑:在 getVal 方法中返回固定的部门名称。

3. 在实体类中应用填充处理器

通过注解 @InsertFillData@UpdateFillData 将自定义处理器绑定到实体字段:

public class User {
    @InsertFillData(DeptNameAutoFillHandler.class)
    private String deptName;

    // 其他字段
}
注解说明:
  • @InsertFillData:仅在插入时触发填充。
  • @UpdateFillData:仅在更新时触发填充。
  • @FillData:通用注解,需显式指定填充时机。

4. 填充处理器的注册与缓存

MPE 通过 AutoFillMetaObjectHandler 自动管理填充处理器的实例化和缓存:

mermaid

流程说明:
  1. 用户执行插入或更新操作。
  2. AutoFillMetaObjectHandler 根据注解找到对应的填充处理器。
  3. 处理器返回填充值,完成字段填充。

5. 高级用法:动态填充

填充处理器支持动态逻辑,例如根据当前用户上下文填充数据:

public class UserNameAutoFillHandler implements AutoFillHandler<String> {
    public static final String userName = "admin";

    @Override
    public String getVal(Object object, Class<?> clazz, Field field) {
        // 实际场景中可从 SecurityContext 获取当前用户
        return userName;
    }
}

6. 测试自定义填充

通过单元测试验证填充逻辑:

@Test
public void testAutoFill() {
    User user = new User();
    userMapper.insert(user);
    assert user.getDeptName().equals(DeptNameAutoFillHandler.deptName);
}

7. 总结表格

功能点实现方式示例
定义填充处理器实现 AutoFillHandler 接口DeptNameAutoFillHandler
绑定到字段使用 @InsertFillData 注解@InsertFillData(DeptNameAutoFillHandler.class)
动态填充getVal 方法中实现逻辑根据用户上下文返回数据

通过以上步骤,开发者可以轻松扩展 MPE 的自动填充功能,满足复杂业务场景的需求。

实际应用案例解析

Mybatis-Plus-Ext(MPE)的自动填充功能在实际开发中提供了极大的便利性,尤其是在处理审计字段、业务逻辑填充等场景时。以下通过一个具体的案例来解析其应用方式。

案例背景

假设我们有一个用户管理系统,需要在用户创建和更新时自动填充用户的部门名称和用户名。这些字段的值通常由业务逻辑决定,而非用户手动输入。

实现步骤

1. 定义自动填充处理器

首先,我们需要定义两个自动填充处理器,分别用于填充用户名和部门名称。

// 用户名填充处理器
public class UserNameAutoFillHandler implements AutoFillHandler<String> {
    public static final String userName = "admin";

    @Override
    public String getVal(Object object, Class<?> clazz, Field field) {
        return userName;
    }
}

// 部门名称填充处理器
public class DeptNameAutoFillHandler implements AutoFillHandler<String> {
    public static final String deptName = "研发部";

    @Override
    public String getVal(Object object, Class<?> clazz, Field field) {
        return deptName;
    }
}
2. 在实体类中应用注解

接下来,在用户实体类中,使用@InsertFillData注解标记需要自动填充的字段。

public class User {
    private Long id;

    @InsertFillData(UserNameAutoFillHandler.class)
    private String name;

    @InsertFillData(DeptNameAutoFillHandler.class)
    private String deptName;

    // 其他字段和getter/setter省略
}
3. 测试自动填充功能

通过单元测试验证自动填充功能是否生效。

@SpringBootTest
public class AutoFillTest {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void testAutoFill() {
        User user = new User();
        userMapper.insert(user);

        assert user.getName().equals(UserNameAutoFillHandler.userName);
        assert user.getDeptName().equals(DeptNameAutoFillHandler.deptName);
    }
}

流程图解析

以下是一个简单的流程图,展示了自动填充功能的执行流程:

mermaid

表格说明

下表总结了自动填充功能的核心组件及其作用:

组件名称作用
AutoFillHandler定义填充逻辑的接口,用户需实现此接口。
@InsertFillData标记字段在插入时自动填充,需指定填充处理器。
AutoFillMetaObjectHandlerMPE的核心类,负责调用填充处理器并完成字段填充。

代码示例扩展

如果需要动态填充字段值,可以结合业务逻辑实现更复杂的处理器:

public class DynamicDeptNameHandler implements AutoFillHandler<String> {
    @Override
    public String getVal(Object object, Class<?> clazz, Field field) {
        // 根据业务逻辑动态返回部门名称
        return "动态部门";
    }
}

通过上述案例,可以看到MPE的自动填充功能不仅简化了开发流程,还能灵活应对各种业务场景。

总结

dromara/mybatis-plus-ext的自动填充功能通过注解驱动和灵活的填充策略,为开发者提供了一种高效、灵活的方式来处理字段填充需求。无论是基本的字段填充还是复杂的业务逻辑,都可以通过自定义填充处理器轻松实现。本文通过设计思路、实现细节、注解使用、自定义处理器开发以及实际案例,全面解析了自动填充功能的应用和优势,帮助开发者更好地理解和使用这一功能。

【免费下载链接】mybatis-plus-ext mybatis-plus框架的拓展包,在框架原有基础上做了进一步的轻度封装,增强内容:免手写Mapper、多数据源自动建表、数据自动填充、自动关联查询、冗余数据自动更新、动态查询条件等。 【免费下载链接】mybatis-plus-ext 项目地址: https://gitcode.com/dromara/mybatis-plus-ext

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值