mybatis-plus通用参数统一处理

本文介绍如何使用Mybatis-Plus的MetaObjectHandler接口,实现对insert和update操作中name字段的统一修改,提升代码可维护性和减少错误。通过自定义MetaObjectHandler并配置到Spring Boot应用中,实现实体类的自动填充规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:实际开发中,我们经常会为表设计创建人、创建时间、更信人、更新时间等通用字段,每个接口都需要增加or修改这些字段,1是代码冗余,2则容易出错。mybatis-plus提供了一种统一处理的方案,解决了这一痛点。

如果需要理解mybatis-plus的基础用法,可以查看作者的另外两篇文章

Mybatis-Plus的使用_m0_37298602的博客-优快云博客https://blog.youkuaiyun.com/m0_37298602/article/details/117788047Mybatis-plus分页查询_m0_37298602的博客-优快云博客如果对mybatis-plus基本使用不清楚的可以查看作者文章简单了解下mybatis-plus:https://blog.youkuaiyun.com/m0_37298602/article/details/117788047https://blog.youkuaiyun.com/m0_37298602/article/details/117808674代码仓贴出:

study: 工具学习,如zookeeper、mybatisplushttps://gitee.com/kwins/study

mybatis-plus提供了MetaObjectHandler接口,我们可以通过实现这个接口,将insert or update前的数据进行改变。

实现如下:

package com.kwin.test.config;

import java.lang.reflect.Field;

import org.apache.ibatis.reflection.MetaObject;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

import lombok.extern.slf4j.Slf4j;

/**
 * 通用参数统一处理
 */
@Slf4j
public class CustomMetaObjectHandler implements MetaObjectHandler {
    

    public static final String NAME = "name";

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("{}", metaObject.getOriginalObject());
        if(validField(metaObject, NAME)) {
            Object value = getFieldValByName(NAME, metaObject);
            Class<?> clzz = metaObject.getGetterType(NAME);
            if(String.class.isAssignableFrom(clzz)) {
                setFieldValByName(NAME, "test", metaObject);
            }
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        
        if(validField(metaObject, NAME)) {
            Object value = getFieldValByName(NAME, metaObject);
            Class<?> clzz = metaObject.getGetterType(NAME);
            if(String.class.isAssignableFrom(clzz)) {
                setFieldValByName(NAME, "test", metaObject);
            }
        }
    }

    private boolean validField(MetaObject metaObject, String fieldName) {
        Object obj = metaObject.getOriginalObject();
        if(obj == null) {
            return false;
        }
        Field[] fields = obj.getClass().getDeclaredFields();
        if(fields.length == 0) {
            return false;
        }

        for(Field field : fields) {
            if(field.getName().equals(fieldName)) {
                return true;
            }
        }
        return false;


    }
}

上述实现通过对name字段进行修改进行验证功能。

实体:

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @author : wangkai
 * @version V1.0
 * @Package com.kwin.test.entity
 * @Description:
 * @date 2021年06月10日 17:37
 **/

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("user")
public class User extends Model<User> {
    @TableId
    private Long id;
    @TableField(fill = FieldFill.INSERT)
    private String name;
    private int age;
    private String email;
    
    @Override
    protected Serializable pkVal() {
        return id;
    }
}

其中,针对需要insert修改的字段指定 @TableField(fill = FieldFill.INSERT) ,同理,需要更新的字段指定@TableField(fill = FieldFill.UPDATE)。

配置注入该bean

package com.kwin.test.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

/**
 * @author : Kwin
 * @version V1.0
 * @Package com.kwin.test.config
 * @Description:
 * @date 2021年06月11日 10:33
 **/

@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig {
    
    @Bean
    public MetaObjectHandler metaObjectHandler() { return new CustomMetaObjectHandler(); }
}

测试用例:

package com.kwin.test;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.kwin.test.entity.User;
import com.kwin.test.service.UserService;

@SpringBootTest
class TestApplicationTests {

    @Autowired
    private UserService userService;

    
    @Test
    void test4() {
        User user = new User();
        user.setId(8L);
        user.setName("test7");
        user.setAge(55);
        user.setEmail("1107@qq.com");
        boolean result = user.insert();
        System.out.println("result is " + result);
        List<User> userList = userService.list();
        for(User user1:userList) {
            System.out.println(user1);
        }
    }
    
}

结果:

 可见,name从test7被修改为test了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值