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 分页插件,用于支持数据库分页查询。它会根据请求中传入的分页参数(比如
pageNum
和pageSize
),自动生成 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 提供的接口,用来实现自动填充逻辑。你需要实现insertFill
和updateFill
方法,分别处理插入和更新时字段的自动填充。
主要方法:
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
(表示未删除)。
updateFill(MetaObject metaObject)
:this.strictUpdateFill(metaObject, "updateTime", Date::new, Date.class)
:在更新时自动填充updateTime
字段,值为当前时间。
功能:
insertFill
方法会在插入操作时自动填充createTime
、updateTime
和delFlag
字段。updateFill
方法会在更新操作时自动填充updateTime
字段。每次更新时,updateTime
字段会被更新为当前时间。
总结:
- 分页插件配置:通过
MybatisPlusInterceptor
和PaginationInnerInterceptor
配置 MyBatis-Plus 的分页插件,用于自动处理分页查询。 - 自动填充功能:通过实现
MetaObjectHandler
接口,自定义MyMetaObjectHandler
类,在插入和更新时自动填充字段,如createTime
、updateTime
和delFlag
。
这两部分功能可以大大简化 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;
}