Mybatis-plus的自动填充功能

1.数据库级别

一般数据库中的某些字段,例如创建时间(create_time)以及修改时间(update_time)都是自动化完成的,我们不希望手动更新。
所有的数据库表都必须包含两个字段gmt_create和gmt_modified,因为我们需要追踪这个数据什么创建,什么时候被修改的,而且需要自动化!
在这里插入图片描述

1.修改数据库的表结构

在已有的数据库表(user)中添加create_time和update_time字段,不仅如此,我们需要设置数据类型为datetime,以及默认值为CURRENT_TIMESTAMP,另外还需要在更新时间(update_time)的左下角有一个根据当前时间更新这个也要√,上图忘了加。
第一种数据库级别我们在工作中一般不会让我们修改数据库的,我们不过要知道这种方式。

2.在实体类中添加创建时间(create_time)以及修改时间(update_time)

在这里插入图片描述
接着我们去实体类User中加入我们的两个字段,这里虽然我们在属性中是使用驼峰命名的,但是我们在数据库刷新的时候会帮我们自动转成下划线的名称方式。因为我们这里在数据库中不区分大小写,所以在数据库里面不能用驼峰。
在这里插入图片描述
在这里插入图片描述
接着我们就去测试类里面改了一个数字,这样我们在运行的时候发现,我们的数据库的时间改变了。

2.代码级别

由于在公司里面数据库一旦创建时不予许修改的,所以我们就需要了解并掌握代码级别的自动填充;

1.修改数据库

在这里插入图片描述
首先我们要将前面数据库级别中的默认设置为null或者不写,还有去掉根据当前时间更新这个框

2.在实体类的字段属性增加注解

部分代码:

package com.kuang.pojo;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    //对应数据库中的主键(uuid、自增id、雪花算法、redis、zookeeper)
    @TableId(type = IdType.AUTO)  //如果属性值为type = IdType.INPUT ,那么我一旦手动输入id之后,就需要自己配置id了
    private Long id;
    private String name;
    private Integer age;
    private String email;

    //字段添加填充内容
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

}

这里一定不要忘记在我们的类上加入@Component,这个是为了将我们的处理器加到IOC容器中,接着我们实现该接口的两个方法,一个插入的填充策略,一个是更新的填充策略,而且使用@Slf4j ,开启log4j日志功能

3.编写处理器来处理注解

package com.kuang.handle;

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

import java.time.LocalDateTime;
import java.util.Date;

@Slf4j
@Component   //一定不要忘记将处理器加到IOC容器中!
public class MyMetaObjectHander implements MetaObjectHandler {

    //插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill.....");
        //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
        //第一个参数 字段名
        //第二个参数 值
        //第三个参数 metaObject
//        this.setFieldValByName("createTime",new Date(),metaObject);
//        this.setFieldValByName("updateTime",new Date(),metaObject);
        // 上面的方法是旧版本,新版本的是使用下面的strictInsertFill方法
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());

    }

    //更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill.....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

这里是我从mybatisplus的官方文档改的,不过有一点要注意的是我们要将实体类User里面的属性的类型要改为LocalDateTime这个类型!

4.测试插入和更新

package com.kuang;

import com.kuang.mapper.UserMapper;
import com.kuang.pojo.User;
import org.junit.jupiter.api.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;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
class MybatisPlusApplicationTests {

    //继承了BaseMapper,所有的方法都来自父类,我们也可以编写自己的扩展方法
    @Autowired
    private UserMapper userMapper;


    @Test
    void contextLoads() {
        // 这里我们的selectList内部的参数是一个Wrapper,条件构造器,这里我们先不用 null
        //查询全部用户
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }

    //测试插入
    @Test
    public void testInsert(){
        User user = new User();
//        user.setId(6L);
        user.setName("万俊锋");
        user.setAge(5);
        user.setEmail("2630445749@qq.com");
        int result = userMapper.insert(user); //帮我们自动生成
        System.out.println(result); //受影响的行数
        System.out.println(user); //发现,id会自动回填

    }

    //测试更新
    @Test
    public void testUpdate(){
        User user = new User();
        //通过条件自动拼接动态SQL
        user.setId(6L);
        user.setName("关注公众号:代码说");
        user.setAge(22);

        //注意:updateById  但是参数是一个对象!
        int i = userMapper.updateById(user);
        System.out.println(i);
    }
}

以上就是Mybatis-plus的自动填充功能,希望能帮助到大家更好的学习mybatis-plus

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值