MyBatis-Plus分页插件和自动填充

发布于:2025-02-10 ⋅ 阅读:(84) ⋅ 点赞:(0)

MyBatis-Plus 的两个重要功能:分页插件自动填充功能

1. 分页插件配置

分页插件的作用是自动处理数据库查询的分页,避免在每个查询中都手动编写分页逻辑。你提供的分页插件配置如下:

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 数据库持久层配置类
 */
@Configuration(value = "dataBaseConfigurationByAdmin")
public class DataBaseConfiguration {

    /**
     * 分页插件
     */
    @Bean
    @ConditionalOnMissingBean
//    @ConditionalOnBean
    public MybatisPlusInterceptor mybatisPlusInterceptorByAdmin() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
解析:
  • @Configuration:该注解用于标识这是一个配置类,Spring 会自动扫描并加载该类。
  • @Bean:这意味着 mybatisPlusInterceptorByAdmin 方法会返回一个 Spring 管理的 Bean。
  • @ConditionalOnMissingBean:当容器中没有同类型的 Bean 时,这个 Bean 才会被创建。避免了重复定义相同的 Bean。
  • MybatisPlusInterceptor:这是 MyBatis-Plus 提供的核心拦截器类。它用于处理各种插件功能(如分页、性能分析等)。
  • PaginationInnerInterceptor(DbType.MYSQL):添加了一个分页拦截器,针对 MySQL 数据库。该拦截器会自动将 SQL 语句转换为分页查询 SQL。
功能:
  • 这段代码的作用是配置一个 MyBatis-Plus 分页插件,用于支持数据库分页查询。它会根据请求中传入的分页参数(比如 pageNumpageSize),自动生成 SQL 中的 LIMIT 子句。

2. 自动填充类配置

自动填充功能是 MyBatis-Plus 提供的一个非常实用的特性,用来在插入和更新数据时自动填充字段,如创建时间、更新时间等。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

import java.util.Date;


@Primary
@Component(value = "myMetaObjectHandlerByAdmin")
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始插入填充...");
        this.strictInsertFill(metaObject, "createTime", Date::new, Date.class); // 自动填充创建时间
        this.strictInsertFill(metaObject, "updateTime", Date::new, Date.class); // 自动填充更新时间
        this.strictInsertFill(metaObject, "delFlag", () -> 0, Integer.class); // 默认 delFlag 为 0(未删除)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("开始更新填充...");
        this.strictUpdateFill(metaObject, "updateTime", Date::new, Date.class); // 自动填充更新时间
    }
}
解析:
  • @Component(value = "myMetaObjectHandlerByAdmin"):该注解表示这是一个 Spring 管理的组件,value 可以用来指定 Bean 的名称。Spring 会根据此名称将该类注册为 Bean。
  • @Primary:该注解表示如果存在多个实现了 MetaObjectHandler 接口的 Bean,Spring 会优先使用标注了 @Primary 的 Bean。
  • MetaObjectHandler:这是 MyBatis-Plus 提供的接口,用来实现自动填充逻辑。你需要实现 insertFillupdateFill 方法,分别处理插入和更新时字段的自动填充。
主要方法:
  1. insertFill(MetaObject metaObject)

    • this.strictInsertFill(metaObject, "createTime", Date::new, Date.class):在插入时自动填充 createTime 字段,值为当前时间。
    • this.strictInsertFill(metaObject, "updateTime", Date::new, Date.class):在插入时自动填充 updateTime 字段,值为当前时间。
    • this.strictInsertFill(metaObject, "delFlag", () -> 0, Integer.class):在插入时自动填充 delFlag 字段,默认值为 0(表示未删除)。
  2. updateFill(MetaObject metaObject)

    • this.strictUpdateFill(metaObject, "updateTime", Date::new, Date.class):在更新时自动填充 updateTime 字段,值为当前时间。
功能:
  • insertFill 方法会在插入操作时自动填充 createTimeupdateTimedelFlag 字段。
  • updateFill 方法会在更新操作时自动填充 updateTime 字段。每次更新时,updateTime 字段会被更新为当前时间。

总结:

  1. 分页插件配置:通过 MybatisPlusInterceptorPaginationInnerInterceptor 配置 MyBatis-Plus 的分页插件,用于自动处理分页查询。
  2. 自动填充功能:通过实现 MetaObjectHandler 接口,自定义 MyMetaObjectHandler 类,在插入和更新时自动填充字段,如 createTimeupdateTimedelFlag

这两部分功能可以大大简化 MyBatis-Plus 的使用,提升开发效率,同时保证数据库操作的一致性和规范性。

使用:

使用注解指定实体类中的某个字段在插入数据时需要进行自动填充。

@Data
public class BaseDO {
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 删除标识 0:未删除 1:已删除
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer delFlag;

}


网站公告

今日签到

点亮在社区的每一天
去签到