IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> MyBatis-Plus公共字段自动填充 -> 正文阅读

[Java知识库]MyBatis-Plus公共字段自动填充

MyBatis-Plus公共字段自动填充

一、准备工作

  1. 在SpringBoot项目中导入必要的依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!--mysql连接驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </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>

    <!-- mybatis-plus启动器 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.0</version>
    </dependency>
</dependencies>
  1. 配置yml文件
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/metaobjecthandler?serverTimezone=GMT%2B8
    username: root
    password: root
  1. 创建数据库和表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` varchar(19) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键ID',
  `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `age` int(0) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '邮箱',
  `gmt_create` datetime(0) DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime(0) DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
  1. 使用MyBatisX插件生成实体类,mapper和server

image-20221020155254229

image-20221020155304227

image-20221020155314823

箭头指向的是生成的代码
image-20221020155348514

在SpringBoot启动类上加上MapperScan注解指定Mapper扫描

image-20221020155930320

  1. 在User类的公共自动上加入注解
// @TableField(fill = FieldFill.INSERT) 为插入是自动填充
// @TableField(fill = FieldFill.INSERT_UPDATE) 为插入和更新时自动填充

/**
 * 创建时间
 */
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;

/**
 * 更新时间
 */
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;

二、编写自动填充规则

创建MyMetaObjectHandler类实现MetaObjectHandler接口,重写insertFill和updateFill方法

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        // 方法1:在3.3.0+版本可以使用strictInsertFill()、strictUpdateFill()方法
        this.strictInsertFill(metaObject, "gmtCreate", Date.class, new Date());
        this.strictUpdateFill(metaObject, "gmtModified", Date.class, new Date());
        // 方法2:通用的自动填充方法
        // this.setFieldValByName("gmtCreate", new Date(), metaObject);
        // this.setFieldValByName("gmtModified", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 这里只有为空才会填充数据 所以修改一下
        // 方法1:在3.3.0+版本可以使用strictUpdateFill()方法
        try {
            if(metaObject.hasSetter("gmtModified")){
                metaObject.setValue("gmtModified", null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.strictUpdateFill(metaObject, "gmtModified", Date.class, new Date());
        // 方法2:通用的自动填充方法
        // this.setFieldValByName("gmtModified", new Date(), metaObject);
    }
}

注意点:

  • 重写的insertFill()和updateFill()方法分别是在插入和更新时执行的
  • strictInsertFill()和strictUpdateFill()方法是在3.3.0+版本中可使用
  • 选择填充的字段是实体类的属性,不是数据库字段名
  • MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充,所以在updateFill()方法中,要先将原先字段设为空,再进行自动填充,否则在该字段有值时执行更新也不能修改该字段的值;方法2通用自动填充方法没有这个问题

三、编写测试类

@SpringBootTest
class MetaobjecthandlerApplicationTests {

    @Autowired
    private UserService userService;

    @Test
    public void testInsert() {
        User user = new User();
        user.setName("张三");
        user.setAge(24);
        user.setEmail("110@qq.com");
        userService.save(user);
        User byId = userService.getById(user.getId());
        System.out.println(user);
        // User [Hash = 453031036, id=1583009524883664898, name=张三, age=24, email=110@qq.com, gmtCreate=Thu Oct 20 16:17:36 CST 2022, gmtModified=Thu Oct 20 16:17:36 CST 2022, serialVersionUID=1]
    }

    @Test
    public void testUpdate() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name","张三");
        User user1 = userService.getOne(wrapper);
        user1.setAge(36);
        userService.updateById(user1);
        User user2 = userService.getOne(wrapper);
        System.out.println(user2);
        // User [Hash = 453445056, id=1583009524883664898, name=张三, age=36, email=110@qq.com, gmtCreate=Thu Oct 20 16:17:36 CST 2022, gmtModified=Thu Oct 20 16:18:58 CST 2022, serialVersionUID=1]
    }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:01:38  更:2022-10-22 21:04:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/30 13:23:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码