Java:Mybatis-Plus自动填充功能配置和使用

news2024/10/6 20:27:14

在这里插入图片描述

Mybatis-Plus可以实现字段自动填充功能

文档

  • https://baomidou.com/pages/4c6bcf/

目录

    • 需求
    • 数据库设置默认值
    • 通过代码的方式进行自动填充
      • 配置自动填充
        • 设置方式一
        • 设置方式二
    • 测试
    • 依赖pom.xml

需求

我们需要自动填充的字段:

  • 插入数据时自动填充:create_time、update_time、deleted
  • 更新数据时自动填充:update_time

可以数据库设置默认值,也可以通过代码的方式进行自动填充

数据库设置默认值

数据库设置默认值

CREATE TABLE `tb_user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(128) NOT NULL COMMENT '用户名',
  `phone` varchar(32) NOT NULL DEFAULT '' COMMENT '手机号',
  `sex` char(1) NOT NULL DEFAULT '' COMMENT '性别',

  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` tinyint NOT NULL DEFAULT '0' COMMENT '1、删除 0、未删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';

通过代码的方式进行自动填充

实体类

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
@Accessors(chain = true)
@TableName("tb_user")
public class UserDO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 用户名
     */
    @TableField("username")
    private String username;

    /**
     * 手机号
     */
    @TableField("phone")
    private String phone;

    /**
     * 性别
     */
    @TableField("sex")
    private String sex;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 1、删除 0、未删除
     */
    @TableField(value = "deleted", fill = FieldFill.INSERT)
    private Integer deleted;
}

字段填充策略枚举类

public enum FieldFill {
    /**
     * 默认不处理
     */
    DEFAULT,
    /**
     * 插入时填充字段
     */
    INSERT,
    /**
     * 更新时填充字段
     */
    UPDATE,
    /**
     * 插入和更新时填充字段
     */
    INSERT_UPDATE
}

配置自动填充

  • 插入时自动填充 insertFill
  • 更新时自动填充 updateFill

设置方式一

// 如果属性不存在,会报错:
// There is no setter for property named 'createTime'
metaObject.setValue("createTime", LocalDateTime.now());

// 设置前需要判断
if (metaObject.hasSetter("createTime")) {
    metaObject.setValue("createTime", LocalDateTime.now());
}

完整代码

package com.example.demo.config;

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;

/**
 * 自动填充元数据
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入时自动填充
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        
        if (metaObject.hasSetter("createTime")) {
            metaObject.setValue("createTime", LocalDateTime.now());
        }

        if (metaObject.hasSetter("updateTime")) {
            metaObject.setValue("updateTime", LocalDateTime.now());
        }

        if (metaObject.hasSetter("deleted")) {
            metaObject.setValue("deleted", 0);
        }
    }

    /**
     * 更新时自动填充
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        if (metaObject.hasSetter("updateTime")) {
            metaObject.setValue("updateTime", LocalDateTime.now());
        }
    }
}

设置方式二

// 起始版本 3.3.3(推荐)
this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);

完整配置方式

package com.example.demo.config;

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;

/**
 * 自动填充元数据
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入时自动填充
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 起始版本 3.3.3(推荐)
        this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);

        this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);

        this.strictInsertFill(metaObject, "deleted", () -> 1, Integer.class);
    }

    /**
     * 更新时自动填充
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 起始版本 3.3.3(推荐)
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
    }
}

测试

package com.example.demo;

import com.example.demo.entity.UserDO;
import com.example.demo.mapper.UserMapper;
import org.assertj.core.util.Lists;
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;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
@RunWith(SpringRunner.class)
public class SqlInjectorTest {

    @Autowired
    private UserMapper mapper;

    @Test
    public void insert() {
        UserDO user = new UserDO();
        user.setUsername("刘备");
        user.setSex("男");

        mapper.insert(user);
        // INSERT INTO tb_user ( username, sex, create_time, update_time, deleted ) VALUES ( ?, ?, ?, ?, ? )
        // 刘备(String), 男(String), 2023-06-02T13:50:22.769(LocalDateTime), 2023-06-02T13:50:22.769(LocalDateTime), 1(Integer)
    }

    @Test
    public void updateById() {
        UserDO user = new UserDO();
        user.setUsername("刘备");
        user.setSex("女");
        user.setId(1);

        mapper.updateById(user);
        // UPDATE tb_user SET username=?, sex=?, update_time=? WHERE id=?
        // 刘备(String), 女(String), 2023-06-02T13:51:17.591(LocalDateTime), 1(Integer)
    }
}

可以看到实现了文章开始的字段自动填充需求

依赖pom.xml

完整依赖如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.7</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.5.2</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/601185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

view的常用属性和方法介绍(arcgis for javascript)

ArcGIS for JavaScript中的视图&#xff08;view&#xff09;是一个地图实例类&#xff0c;用于管理地图的显示区域、符号和标注等。通过视图类&#xff0c;可以实现以下功能&#xff1a; 显示地图&#xff1a;将地图显示在Web页面上。 缩放&#xff1a;缩放视图到指定的级别。…

Benewake(北醒) 快速实现TF40与电脑通信操作说明

目录 一、前言二、工具准备1. TTL-USB 转接线2. TF403. 兆信直流电源4. 连接线5. PC&#xff1a;Windows 系统6. 上位机 WINCC_TF 三、 连接方式1. TTL-USB 转接线接口说明2. TF40 引脚功能及连接说明3. 连线图 四、TF40 与电脑通信操作说明1. 参数设置2.获取测距值3. 设置波特…

百度倾力出品|《神经网络机器翻译技术及产业应用》正式上线

随着经济社会的国际交流合作日益密切&#xff0c;人们迫切需要高质量、高效率的跨语言信息获取和传播工具。《神经网络机器翻译技术及产业应用》以产业需求为牵引&#xff0c;分析了新时期机器翻译的产业需求特点和挑战&#xff0c;介绍了神经网络翻译的基本理论、前沿技术以及…

10课程设计收尾及优秀作品展示答辩【FPGA模型机课程设计】

10课程设计收尾及优秀作品展示答辩【FPGA模型机课程设计】 前言说明推荐10课程设计收尾及优秀作品展示答辩安排 目录一、单周期CPU的设计过程1、基本的20条指令固定指令格式设计I 型指令设计J型指令设计lw sw指令设计 2、扩展的20条指令J型扩展指令设计乘法除法指令格式 3、实现…

阿里云推出工作学习 AI 助手“通义听悟”;谷歌发布 PaLM2;吴恩达推出了三门课

&#x1f989; AI新闻 &#x1f680; 阿里云推出工作学习 AI 助手“通义听悟” 摘要&#xff1a;阿里云峰会・粤港澳大湾区上&#xff0c;阿里云宣布推出最新产品“通义听悟”&#xff0c;该产品能用于会议讨论、教学培训、调研访谈、视频观看等场景&#xff0c;依托大模型&a…

CDS Core Data Services S4 CDS view--1

下一代的数据库视图。比DDIC view能干。 也就是S4上了之后就用这个CDS view了。 目录 1. 软件安装 2. CDS view 是啥 3. 怎么去建CDS view 4. 如何修改一个CDS view&#xff0c;添加association关联 5. 一些有用的功能 6. 基础语法 6.1 Case 6.2 Cast 6.3 String 6…

【程序】基于matlab使用线性 FM 脉冲波形拉伸处理进行距离估计

一、前言 此示例展示了如何在使用线性 FM 脉冲波形的雷达系统中使用拉伸处理来估计目标的范围。 二、介绍 线性FM波形是现代雷达系统中的热门选择&#xff0c;因为它可以通过扫描宽带宽来实现高范围分辨率。然而&#xff0c;当带宽达到数百兆赫甚至千兆赫兹时&#xff0c;在数字…

【C进阶】文件操作(下)(详解--适合初学者入门)

目录 补充的知识点:> 标准流 FILE型 fopen(打开文件) fclose(关闭文件) 5.文件的随机读写&#x1f4bb; 5.1 fwrite&#x1f4c2; 5.2fread&#x1f4c2; 5.3fseek&#x1f4c2; 5.4 ftell&#x1f4c2; 5.5 rewind&#x1f4c2; 6.文本文件和二进制文件&#x1f4bb; 7.文件…

如何做好网站建设定制开发

随着互联网的发展&#xff0c;如今的网站建设技术越来越先进&#xff0c;所以在网站建设定制开发中就出现了很多的模版&#xff0c;如&#xff1a;企业类型、产品信息、品牌介绍等。当然网站建设定制开发不是说只要模版就行了&#xff0c;对于网站建设而言&#xff0c;模版只是…

【送书福利-第八期】《硅基物语.AI大爆炸: ChatGPT→AIGC→GPT-X→AGI进化→魔法时代→人类未来》

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、内容介绍三、作者介…

如何进行网站建设定制开发

如今&#xff0c;由于互联网的迅速发展&#xff0c;市场竞争越来越激烈&#xff0c;企业想要在市场中保持竞争力&#xff0c;就必须要有自己的品牌形象。而网站建设则是品牌建设的重要组成部分&#xff0c;一个好的网站能够有效提升企业品牌形象&#xff0c;提高客户满意度和忠…

Linux LNMP(Linux NGINX MySQL PHP)

NGINX处理静态页面性能出色&#xff0c;但是动态页面几乎没有处理能力&#xff0c;比Apache还差 所以涉及动态页面的场合一般由PHP Python Java&#xff08;后缀php&#xff0c;py&#xff0c;jsp&#xff09;等处理 静态页面请求 客户端 -> nginx动态页面请求 …

【工具推荐】使用D3.js制作网页版网络拓扑图,可拖转可跳转链接

文章目录 一、有哪些工具可以生成带链接的网络拓扑图二、推荐使用D3.js三、写个 demo吧四、d3.js相关学习资料1.官方网站2.D3.js 教程3.D3.js 教程 一、有哪些工具可以生成带链接的网络拓扑图 有一些 JavaScript 库可以帮助你创建网络拓扑图&#xff0c;并且支持将每个节点作为…

chatgpt赋能python:Python函数相加:如何使用函数进行数学计算

Python函数相加&#xff1a;如何使用函数进行数学计算 在Python编程中&#xff0c;函数是一种非常有用的工具&#xff0c;可以将代码组织成可重复使用的块。函数可以接受输入并产生输出&#xff0c;也可以执行任何数量的操作。在本文中&#xff0c;我们将介绍如何使用Python函…

美创科技新一代 灾备一体化平台(DRCC v3.0)发布

随着数字化转型浪潮的迅速推进&#xff0c;关键基础设施的运行安全和业务连续性保证成为数字化建设的基石。 云计算时代带来的资产复杂性和灾备技术多态性&#xff0c;给灾备能力建设、灾备资源高效利用和日常灾备运营提出了新挑战。灾备建设如何“简单又弹性”、灾备运营如何“…

Cloudflare 的 Kafka 故事:在处理 1 万亿条消息的过程中吸取的经验教训

关键要点 Cloudflare在处理大量数据时使用Kafka集群&#xff0c;开发了一个通用的消息总线集群&#xff0c;以解耦团队、有效扩展和处理数万亿条消息。 为了解决事件驱动系统中无结构通信的问题&#xff0c;应建立一个强有力的契约&#xff1a;跨平台数据格式Protobuf帮助Cl…

【教程】路由器自动定时登录校园网

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 目录 前景提要 Python脚本 Shell脚本(推荐) 路由器挂机 实现效果 前景提要 小米路由R4A千兆版安装breedOpenWRT教程以及救砖&#xff08;全脚本无需硬改&#xff09;【教程】保姆级红米AX6000刷UBoot和OpenW…

【Shiro】使用org.crazycake依赖的ShiroConfig

前言 整个Shiro专题中&#xff0c;这个部分是最早需要开始看的&#xff0c;主要先了解ShiroConfig都有哪些东西&#xff1b;由于这个项目使用的redis依赖是org.crazycake的shiro-redis&#xff0c;与我后面所用的不同&#xff0c;所以该部分只是简单的梳理了一下。 PS&#xf…

Hadoop高可用集群

HA高可用集群 HA介绍 什么是HA HA: High Availability&#xff0c;高可用集群&#xff0c;指的是集群7*24小时不间断服务。 为什么需要HA 在HDFS中&#xff0c;有NameNode、DataNode和SecondaryNameNode角色的分布&#xff0c;客户端所有的操作都是要与NameNode交互的&#xff…

PG数据库提示: FATAL: sorry, too many clients already

目录 场景&#xff1a; idea启动提示如下错误 翻译&#xff1a; 连接数相关查询&#xff1a; 原因分析&#xff1a; 解决方法&#xff1a; 场景&#xff1a; idea启动提示如下错误 org.postgresql.util.PSQLException: FATAL: sorry, too many clients alreadyat org.pos…