mybatis-plus

11.MybatisPlus 自动填充

2020-03-27  本文已影响0人  神奇作手

1.简介

  有的表中有新增时间、最后一次操作时间、创建人,最后一次操作人等问题,每次操作时都需要去添加对应的数据,每一块的操作都要添加此操作,比较麻烦。这时候可以使用mybatis-plus的自动填充。

2.自动填充实现

2.1.在实体类中对字段添加注解,标明要进行自动填充

    @TableField(fill = FieldFill.INSERT)//创建时填充
    private LocalDateTime createTime;//创建时间

    @TableField(fill = FieldFill.UPDATE)//修改时填充
    private LocalDateTime updateTime;//修改时间

2.2.自定义自动填充实现类MyMetaObjectHandler实现MetaObjectHandler

package com.mp.component;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @Description 自动填充类
 * @Author LL
 * @Date 2020-03-27 09:58
 */
@Component
public class MyMetqObjectHandle implements MetaObjectHandler {

    //添加时填充
    @Override
    public void insertFill(MetaObject metaObject) {
        setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
//        setFieldValByName("createTime", LocalDateTime.now(), metaObject);//通用方法
    }

    //更新时填充
    @Override
    public void updateFill(MetaObject metaObject) {
        setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
//        setFieldValByName("updateTime", LocalDateTime.now(), metaObject);//通用方法
    }
}

2.3.编写测试类测试

package com.mp.fill;

import com.mp.dao.UserMapper;
import com.mp.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @Description 自动填充测试
 * @Author LL
 * @Date 2020-03-27 10:04
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class FillTest {

    @Autowired
    private UserMapper userMapper;

    /**
     * 测试添加时自动填充
     */
    @Test
    public void insert(){
        User user = new User();
        user.setName("关羽")
                .setAge(32)
                .setEmail("gy@baomidou.com")
                .setManagerId(1088248166370832385L);
        int row = userMapper.insert(user);
        System.out.println("影响行数:"+row);

        User res = userMapper.selectById(user.getId());
        System.out.println(res);
    }

    /**
     * 测试更新时自动填充
     */
    @Test
    public void update(){
        User user = new User();
        user.setId(1243360631283564545L)
                .setAge(33);
        int row = userMapper.updateById(user);
        System.out.println("影响行数:"+row);

        User res = userMapper.selectById(1243360631283564545L);
        System.out.println(res);
    }

}

3.自动填充优化

在自动填充前可以做一系列的代码逻辑处理,处理后在填充

package com.mp.component;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @Description 自动填充类
 * @Author LL
 * @Date 2020-03-27 09:58
 */
@Component
public class MyMetqObjectHandle implements MetaObjectHandler {

    //添加时填充
    @Override
    public void insertFill(MetaObject metaObject) {
        boolean hasSetter = metaObject.hasSetter("createTime");//判断是否有此字段
        boolean hasGetter = metaObject.hasGetter("createTime");
        System.out.println(hasSetter);
        System.out.println(hasGetter);
        if (hasSetter){//有此字段了,在自动填充
            System.out.println("填充添加处理~~~");
            setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
        }
//        setFieldValByName("createTime", LocalDateTime.now(), metaObject);//通用方法
    }

    //更新时填充
    @Override
    public void updateFill(MetaObject metaObject) {
        Object val = getFieldValByName("updateTime", metaObject);
        if (val==null){//是否自己设置了此字段的值
            System.out.println("填充更新处理~~~");
            setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        }
//        setFieldValByName("updateTime", LocalDateTime.now(), metaObject);//通用方法
    }
}
上一篇 下一篇

猜你喜欢

热点阅读