目录

引言

@TableField注解简介

使用方法

1. 在实体类中添加字段

2. 配置字段填充处理器

3. 配置MyBatisPlus的自动填充

4. 测试自动填充功能

总结


引言

MyBatisPlus是一款强大的Java持久框架,它在MyBatis的基础上进行了功能扩展优化。其中,自动填充字段一个常见需求可以通过使用MyBatisPlus的注解@TableField实现本文介绍如何使用@TableField注解完成字段自动填充的功能。

@TableField注解简介

@TableField注解是MyBatisPlus提供的用于实体类字段的注解,用于配置字段属性行为。其中,我们可以通过设置fill属性实现字段自动填充的功能。

使用方法

下面是使用@TableField注解完成字段自动填充的步骤

1. 在实体类添加字段

首先,在实体类添加需要自动填充的字段。例如,我们在User实体类添加createTime和updateTime字段,用于记录创建时间更新时间

javaCopy codepublic class User {
    private Long id;
    private String name;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    // 省略getter和setter方法
}

2. 配置字段填充处理器

接下来,我们需要配置字段填充的处理器。在MyBatisPlus中,我们可以通过实现MetaObjectHandler接口自定义填充处理器

javaCopy code@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

上述代码中,我们实现insertFill和updateFill两个方法,分别用于插入和更新操作时自动填充字段的值。

3. 配置MyBatisPlus的自动填充

最后,我们需要在MyBatisPlus的配置文件中进行配置,以启用自动填充功能。

javaCopy code@Configuration
public class MyBatisPlusConfig {
    @Autowired
    private MyMetaObjectHandler myMetaObjectHandler;
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new MetaObjectHandlerInterceptor(myMetaObjectHandler));
        return interceptor;
    }
}

上述代码中,我们将自定义的填充处理器MyMetaObjectHandler添加到MybatisPlusInterceptor中,并将其作为一个内部拦截器

4. 测试自动填充功能

现在,我们可以进行测试看看自动填充功能是否生效

javaCopy codeUser user = new User();
user.setName("John");
userService.save(user);

上述代码中,我们创建了一个User对象,并设置了name属性值为“John”。当调用userServicesave方法保存对象时,createTime和updateTime字段将会被自动填充为当前的时间。

以下是一个示例代码演示如何使用@TableField注解完成字段自动填充的功能:

javaCopy code// User.java
public class User {
    private Long id;
    private String name;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    // 省略getter和setter方法
}
// MyMetaObjectHandler.java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}
// MyBatisPlusConfig.java
@Configuration
public class MyBatisPlusConfig {
    @Autowired
    private MyMetaObjectHandler myMetaObjectHandler;
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new MetaObjectHandlerInterceptor(myMetaObjectHandler));
        return interceptor;
    }
}
// UserService.java
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    
    public void save(User user) {
        userMapper.insert(user);
    }
}
// UserController.java
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    
    @PostMapping("/users")
    public void createUser(@RequestBody User user) {
        userService.save(user);
    }
}

上述示例代码中,我们定义了一个User实体类,其中包含需要自动填充的createTime和updateTime字段。我们使用@TableField注解来标记两个字段,通过设置fill属性为FieldFill.INSERT和FieldFill.INSERT_UPDATE来指定字段自动填充的时机。 我们还定义了一个MyMetaObjectHandler类,实现了MetaObjectHandler接口,并重写insertFill和updateFill方法实现具体的字段填充逻辑。 在MyBatisPlusConfig类中,我们将自定义的填充处理器MyMetaObjectHandler添加到MybatisPlusInterceptor中,并作为一个内部拦截器最后,在UserController中,我们通过调用userService的save方法保存用户对象。当保存操作触发时,createTime和updateTime字段将会被自动填充为当前的时间。 请根据实际需求修改代码中的参数逻辑适应你的项目

MetaObjectHandlerInterceptor 类是一个自定义实现类,用于实现 MyBatis-Plus 框架拦截器功能。下面是一个可能的 MetaObjectHandlerInterceptor 类的代码示例

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import java.util.Properties;
@Intercepts({
        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class MetaObjectHandlerInterceptor implements Interceptor {
    private MyMetaObjectHandler myMetaObjectHandler; // 自定义的 MetaObjectHandler
    public MetaObjectHandlerInterceptor(MyMetaObjectHandler myMetaObjectHandler) {
        this.myMetaObjectHandler = myMetaObjectHandler;
    }
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        Object parameter = invocation.getArgs()[1];
        // 在执行 update 方法之前,调用自定义的 MetaObjectHandler 填充数据
        myMetaObjectHandler.insertFill(mappedStatement, parameter);
        return invocation.proceed();
    }
    @Override
    public Object plugin(Object target) {
        if (target instanceof Executor) {
            return Plugin.wrap(target, this);
        }
        return target;
    }
    @Override
    public void setProperties(Properties properties) {
        // 设置拦截器属性
    }
}

上述代码使用了 MyBatis 的拦截器功能 (@Intercepts 和 @Signature 注解) 来实现对 Executor 类的 update 方法进行拦截。在拦截方法中,将会调用自定义的 MetaObjectHandler 的 insertFill 方法进行数据填充,然后再继续执行原始的方法逻辑。 请注意,上述代码中的 ​​MyMetaObjectHandler​​ 是自定义的 ​​MyMetaObjectHandler​​ 类,需要根据自己业务逻辑来实现该类。​​MyMetaObjectHandler​可以继承com.baomidou.mybatisplus.core.handlers.MetaObjectHandler​​ 类,并重写对应的方法,以实现数据库操作前后的自定义处理逻辑

一个实际的应用场景是,在用户注册时,自动为用户生成一个唯一的邀请码,并将邀请码存储到用户表中。以下是一个示例代码:

javaCopy code// User.java
public class User {
    private Long id;
    private String name;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    @TableField(fill = FieldFill.INSERT)
    private String inviteCode;
    // 省略getter和setter方法
}
// MyMetaObjectHandler.java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "inviteCode", String.class, generateInviteCode());
    }
    
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
    
    private String generateInviteCode() {
        // 生成唯一的邀请码逻辑
        // 可以使用UUID、随机字符串方式生成唯一的邀请码
        // 这里只是一个示例,实际应用需要根据具体需求进行处理
        return UUID.randomUUID().toString().replace("-", "");
    }
}
// MyBatisPlusConfig.java
@Configuration
public class MyBatisPlusConfig {
    @Autowired
    private MyMetaObjectHandler myMetaObjectHandler;
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new MetaObjectHandlerInterceptor(myMetaObjectHandler));
        return interceptor;
    }
}
// UserService.java
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    
    public void save(User user) {
        userMapper.insert(user);
    }
}
// UserController.java
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    
    @PostMapping("/users")
    public void createUser(@RequestBody User user) {
        userService.save(user);
    }
}

在上述示例代码中,我们新增了一个inviteCode字段,并使用@TableField注解将其标记为需要自动填充的字段。在MyMetaObjectHandler类的insertFill方法中,我们通过调用generateInviteCode方法生成一个唯一的邀请码,并将其填充到inviteCode字段中。generateInviteCode方法中使用UUID来生成一个唯一字符串作为邀请码,然后去掉其中的”-“字符。 当用户注册时,会调用UserController中的createUser方法,该方法会调用userService的save方法保存用户对象。在保存操作触发时,createTime、updateTime和inviteCode字段将会被自动填充。inviteCode字段的值将会是一个唯一的邀请码。 请根据你的实际需求,修改代码中的参数逻辑适应你的项目

总结

通过使用@TableField注解和自定义的MetaObjectHandler填充处理器,我们可以很方便地实现字段的自动填充功能。在MyBatisPlus中,这个功能可以简化我们的开发工作提高代码的可维护性和可读性。希望本文大家在使用MyBatisPlus进行开发时有所帮助!

原文地址:https://blog.csdn.net/q7w8e9r4/article/details/133638751

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_36170.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注