Kevin's blog Kevin's blog
首页
  • Java基础
  • Java高级
  • MySQL
  • JDBC
  • Java 8新特性
  • 原生Servlet
  • 延迟队列
  • 分布式事务
  • ActiveMQ
  • Elasticsearch
  • Stream API
  • Redis 实战(黑马程序员)
  • Redis 课程(尚硅谷)
  • Redis数据类型和常用命令
  • 版本控制
  • Spring Framework
  • Spring MVC Framework
  • MyBatis Framework
  • MyBatis Plus Framework
  • Spring Boot Framework
  • 韩顺平 Spring Boot Framework
  • 在线教育
  • 谷粒商城 - 分布式基础 高级 集群
  • 谷粒商城 - 详细开发文档
  • docker基础
  • docker-compose容器编排
  • docker swarm集群管理
  • Vue2基础
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Kevin

Java系统笔记
首页
  • Java基础
  • Java高级
  • MySQL
  • JDBC
  • Java 8新特性
  • 原生Servlet
  • 延迟队列
  • 分布式事务
  • ActiveMQ
  • Elasticsearch
  • Stream API
  • Redis 实战(黑马程序员)
  • Redis 课程(尚硅谷)
  • Redis数据类型和常用命令
  • 版本控制
  • Spring Framework
  • Spring MVC Framework
  • MyBatis Framework
  • MyBatis Plus Framework
  • Spring Boot Framework
  • 韩顺平 Spring Boot Framework
  • 在线教育
  • 谷粒商城 - 分布式基础 高级 集群
  • 谷粒商城 - 详细开发文档
  • docker基础
  • docker-compose容器编排
  • docker swarm集群管理
  • Vue2基础
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Spring Framework

  • Sprng MVC Framework

  • Mybatis

  • Mybatis Plus

    • MyBatis-Plus
    • 指南

      • 快速入门

      • 核心功能

      • 扩展

        • 逻辑删除
        • 通用枚举
        • 字段类型处理器
        • 自动填充功能
        • SQL注入器
        • 执行SQL分析打印
        • 数据安全保护
        • 多数据源
        • MybatisX快速开发插件
        • 企业高级特性
        • 脚本自动维护
      • 插件

    • 配置

    • 生态

    • 问答

    • 支持

    • 低代码平台

  • Spring Boot

  • Spring Cloud

自动填充功能

示例工程:

👉 mybatis-plus-sample-auto-fill-metainfo (opens new window)

原理:

  • 实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler

  • 注解填充字段 @TableField(.. fill = FieldFill.INSERT) 生成器策略部分也可以配置!

public class User {

    // 注意!这里需要标记为填充字段
    @TableField(.. fill = FieldFill.INSERT)
    private String fillField;

    ....
}
1
2
3
4
5
6
7
8
  • 自定义实现类 MyMetaObjectHandler
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
        // 或者
        this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
        // 或者
        this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)
        // 或者
        this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

注意事项:

  • 填充原理是直接给entity的属性设置值!!!

  • 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null

  • MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充

  • 字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段

  • 填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component或@Bean注入

  • 要想根据注解FieldFill.xxx和字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法

  • 不需要根据任何来区分可以使用父类的fillStrategy方法

  • update(T t,Wrapper updateWrapper)时t不能为空,否则自动填充失效

  • 当自定义mapper方法需要走填充时,建议按下列注解方式添加参数注解(如果使用编译参数保留的情况下,变量名字与注解名字保持一致也行)

    数据类型 注解 示例
    Collection @Param("collection") 或 @Param("coll") saveXxx(@Param("collection") Collection h2Users)
    List @Param("list") saveXxx(@Param("list") List h2Users)
    Array @Param("array") saveXxx(@Param("array") H2User[] h2Users)
    实体 @Param("et") saveXxx(@Param("et") H2User h2Users)

    参数填充示例:

     insertFillByCustomMethod1(H2User h2User);
     insertFillByCustomMethod8(H2User[] h2Users);
     insertFillByCustomMethod4(Collection<H2User> h2User);
    
     insertFillByCustomMethod6(@Param("coll") Collection<H2User> h2User);
     insertFillByCustomMethod5(@Param("collection") Collection<H2User> h2User);
     insertFillByCustomMethod7(@Param("list") List<H2User> h2User);
     insertFillByCustomMethod9(@Param("array") H2User[] h2Users);
    
     //et标记的会填充,coll虽然是特殊的key值,但不属于实体,所以不会处理
     updateFillByCustomMethod2(@Param("coll") Collection<Long> ids, @Param("et") H2User h2User);  
     updateFillByCustomMethod4(@Param("colls") Collection<Long> ids, @Param("et") H2User h2User);
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    无法填充示例:

    //方法虽然与上面方法一致,但key值不满足填充条件,需要将user换成et才能正确填充 
    updateFillByCustomMethod3(@Param("coll") Collection<Long> ids, @Param("user") H2User h2User); 
    
    1
    2

​ 注意: 3.5.3.3-SNAPSHOT版本之前有未处理类型不匹配情况,当参数名称与上表一致但类型不一致的话会导致强转错误. 传送门 (opens new window)

public enum FieldFill {
    /**
     * 默认不处理
     */
    DEFAULT,
    /**
     * 插入填充字段
     */
    INSERT,
    /**
     * 更新填充字段
     */
    UPDATE,
    /**
     * 插入和更新填充字段
     */
    INSERT_UPDATE
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
编辑 (opens new window)
上次更新: 2024/06/15, 15:12:25
字段类型处理器
SQL注入器

← 字段类型处理器 SQL注入器→

最近更新
01
04.Spring Boot 韩顺平
10-12
02
day14
08-29
03
day09
08-29
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式