Mybatis拦截器实现公共字段填充

简介: 通过使用MyBatis拦截器,可以实现对公共字段的自动填充,简化代码,提高开发效率。拦截器通过拦截SQL操作,在插入和更新操作时自动填充公共字段,使得开发者不再需要手动设置这些字段。本文详细介绍了实现步骤,并通过示例代码展示了具体实现方法,希望能为您的开发工作提供实用的指导和帮助。

在使用MyBatis进行数据库操作时,通常需要对一些公共字段进行自动填充,例如创建时间、更新时间、创建人等。为了简化这些操作,可以使用MyBatis拦截器来实现公共字段的自动填充。本文将详细介绍如何实现这一功能。

实现步骤

1. 创建拦截器

首先,我们需要创建一个MyBatis拦截器。MyBatis提供了 Interceptor接口,我们可以通过实现该接口来定义自己的拦截逻辑。

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.util.Date;
import java.util.Properties;

@Intercepts({
    @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),
    @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class CommonFieldInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        if (invocation.getArgs().length > 1) {
            Object parameter = invocation.getArgs()[1];
            if (parameter instanceof BaseEntity) {
                BaseEntity entity = (BaseEntity) parameter;
                if (isInsertOperation(invocation)) {
                    entity.setCreateTime(new Date());
                    entity.setUpdateTime(new Date());
                } else if (isUpdateOperation(invocation)) {
                    entity.setUpdateTime(new Date());
                }
            }
        }
        return invocation.proceed();
    }

    private boolean isInsertOperation(Invocation invocation) {
        String methodName = ((MappedStatement) invocation.getArgs()[0]).getId();
        return methodName.contains("insert");
    }

    private boolean isUpdateOperation(Invocation invocation) {
        String methodName = ((MappedStatement) invocation.getArgs()[0]).getId();
        return methodName.contains("update");
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        // 可选:设置属性
    }
}
​

2. 基础实体类

为了统一管理公共字段,我们需要创建一个基础实体类,所有需要自动填充公共字段的实体类都应继承该类。

import java.util.Date;

public class BaseEntity {
    private Date createTime;
    private Date updateTime;

    // getters and setters
    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}
​

3. 配置拦截器

在MyBatis配置文件中注册拦截器。

<plugins>
    <plugin interceptor="com.example.mybatis.interceptor.CommonFieldInterceptor"/>
</plugins>
​

4. 使用示例

创建一个继承 BaseEntity的实体类,并在Mapper中使用该实体类进行数据库操作。

public class User extends BaseEntity {
    private Long id;
    private String name;

    // getters and setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
​
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Update;

public interface UserMapper {
    @Insert("INSERT INTO user (name, create_time, update_time) VALUES (#{name}, #{createTime}, #{updateTime})")
    void insert(User user);

    @Update("UPDATE user SET name = #{name}, update_time = #{updateTime} WHERE id = #{id}")
    void update(User user);
}
​

关键点分析

拦截器

拦截器用于拦截MyBatis执行的SQL操作,通过 @Intercepts@Signature注解指定拦截的对象和方法。在 intercept方法中,我们通过判断操作类型(插入或更新)来填充相应的公共字段。

基础实体类

基础实体类 BaseEntity包含了需要自动填充的公共字段及其getter和setter方法。所有需要自动填充公共字段的实体类都应继承该类。

配置和使用

在MyBatis配置文件中注册拦截器,并在Mapper中使用继承自 BaseEntity的实体类进行数据库操作,确保公共字段能够自动填充。

分析说明表

步骤 描述
创建拦截器 实现 Interceptor接口,通过拦截MyBatis操作自动填充公共字段
基础实体类 定义包含公共字段的基础实体类,所有需要自动填充的实体类都继承该类
配置拦截器 在MyBatis配置文件中注册拦截器
使用示例 创建实体类和Mapper进行数据库操作,验证自动填充功能

思维导图

MyBatis拦截器实现公共字段填充
|
|-- 创建拦截器
|   |-- 实现Interceptor接口
|   |-- 判断操作类型(插入或更新)
|   |-- 填充公共字段
|
|-- 基础实体类
|   |-- 定义公共字段
|   |-- 继承BaseEntity
|
|-- 配置拦截器
|   |-- MyBatis配置文件中注册拦截器
|
|-- 使用示例
|   |-- 创建实体类
|   |-- 创建Mapper
|   |-- 执行数据库操作
​

结论

通过使用MyBatis拦截器,可以实现对公共字段的自动填充,简化代码,提高开发效率。拦截器通过拦截SQL操作,在插入和更新操作时自动填充公共字段,使得开发者不再需要手动设置这些字段。本文详细介绍了实现步骤,并通过示例代码展示了具体实现方法,希望能为您的开发工作提供实用的指导和帮助。

目录
相关文章
|
4月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
300 8
|
2月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
3月前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
101 1
|
4月前
|
SQL Java 数据库连接
解决mybatis-plus 拦截器不生效--分页插件不生效
本文介绍了在使用 Mybatis-Plus 进行分页查询时遇到的问题及解决方法。依赖包包括 `mybatis-plus-boot-starter`、`mybatis-plus-extension` 等,并给出了正确的分页配置和代码示例。当分页功能失效时,需将 Mybatis-Plus 版本改为 3.5.5 并正确配置拦截器。
1180 6
解决mybatis-plus 拦截器不生效--分页插件不生效
|
6月前
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
71 7
|
7月前
|
SQL 人工智能 Java
mybatis-plus配置sql拦截器实现完整sql打印
_shigen_ 博主分享了如何在MyBatis-Plus中打印完整SQL,包括更新和查询操作。默认日志打印的SQL用?代替参数,但通过自定义`SqlInterceptor`可以显示详细信息。代码示例展示了拦截器如何替换?以显示实际参数,并计算执行时间。配置中添加拦截器以启用此功能。文章提到了分页查询时的限制,以及对AI在编程辅助方面的思考。
944 5
mybatis-plus配置sql拦截器实现完整sql打印
|
7月前
|
数据库
MyBatis-Plus如何自动填充数据表的创建时间和更新时间
MyBatis-Plus如何自动填充数据表的创建时间和更新时间
274 1
|
6月前
|
数据库
MybatisPlus3---常用注解,驼峰转下滑线作为表明 cteateTime 数据表中的 cteate_time,@TableField,与数据库字段冲突要使用转义字符“`order`“,is
MybatisPlus3---常用注解,驼峰转下滑线作为表明 cteateTime 数据表中的 cteate_time,@TableField,与数据库字段冲突要使用转义字符“`order`“,is
|
3月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
165 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
3月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
94 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块