MyBatis-Plus学习——字段自动填充

Posted sadoshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis-Plus学习——字段自动填充相关的知识,希望对你有一定的参考价值。

前言

现在项目中的数据库表经常会加上create_time和update_time字段,表示记录的创建时间和更新时间。而这两个字段的信息通常不需要我们手动填写,可以交给框架自动填充。本文准备介绍Mybatis-Plus中如何使用字段自动填充的功能。

 

字段自动填充的实现

首先我们新建另一张表,表示部门dept

DROP TABLE IF EXISTS dept;

CREATE TABLE dept (
   `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
   `name` VARCHAR(30) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '部门名称',
   `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
   `update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
   PRIMARY KEY (`id`)
 )

 

创建实体类Dept,这里要用@TableField注解标注需要自动填充的字段。FieldFill.INSERT表示插入记录时触发自动填充,FieldFill.INSERT_UPDATE表示插入和更新记录时都会自动填充。

package com.sadoshi.mybatisplus.springboottest.model;

import java.util.Date;

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.Data;

@Data
public class Dept {

	@TableId(type=IdType.AUTO)
	private Long id;
	
	private String name;
	
	@TableField(fill=FieldFill.INSERT)
	private Date createTime;
	
	@TableField(fill=FieldFill.INSERT_UPDATE)
	private Date updateTime;
}

 

接着我们要写一个自定义的填充类。

package com.sadoshi.mybatisplus.springboottest.handler;

import java.util.Date;

import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

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

@Component
public class MyMetaObjectHandler implements MetaObjectHandler{

	@Override
	public void insertFill(MetaObject metaObject) {
		System.out.println("start insert fill ....");
		this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
		this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
	}

	@Override
	public void updateFill(MetaObject metaObject) {
		System.out.println("start update fill ....");
		this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
	}

}

 

最后我们写一个插入dept组件类并让主类调用testInsert方法进行测试。

package com.sadoshi.mybatisplus.springboottest.component;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.sadoshi.mybatisplus.springboottest.mapper.DeptMapper;
import com.sadoshi.mybatisplus.springboottest.model.Dept;

@Component
public class DeptComponent {
	
	@Autowired
    private DeptMapper deptMapper;
	
	public void testInsert() {
		System.out.println(("----- insert method test ------"));
		Dept dept = new Dept();
		dept.setName("人事部");
		deptMapper.insert(dept);
	}

}

执行testInsert后查看数据库记录,create_time和update_time已经被自动填充进去。

 

遇到的问题

之前也遇到一点小问题,就是在自定义填充类里面,对于函数:

this.strictInsertFill(metaObject, "createTime", Date.class, new Date());

一定填入与实体类匹配的类型,否则可能无法自动填充,程序也没有相应的报错,很难查错。当时我直接复制官网的例子,填入的类型是LocalDateTime类型,而实体类Dept的时间是Date类型,然后一直都没成功,还以为是没触发自动填充。

以上是关于MyBatis-Plus学习——字段自动填充的主要内容,如果未能解决你的问题,请参考以下文章

开发小知识-mybatis-plus自动填充与读写分离

浅谈MyBatis-Plus学习之公共字段自动填充

Mybatis-Plus实现公共字段自动赋值

springboot 整合Mybatis-Plus分页自动填充功能

MyBatis-Plus-自动填充功能(学习笔记)

Mybatis-Plus自动填充功能 - 踩坑