Mybatis-Plus公共字段自动填充注解使用说明@TableField、@Version

import java.util.Date;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.Version;
import com.baomidou.mybatisplus.enums.FieldFill;
import com.baomidou.mybatisplus.enums.IdType;

/**

  • ClassName: BaseEntity

  • Description: 实体类基类

  • Date: 2018年8月27日 上午11:43:58


  • @author wsp@sunnybs.com(邮箱)

  • @version 产品版本信息 2018-12-06 姓名(邮箱) 修改信息

*/
@SuppressWarnings("rawtypes")
public abstract class BaseEntity<T extends Model> extends Model {

private static final long serialVersionUID = 1L;


/**
 * id
 */
@TableId(value = "id", type = IdType.AUTO)
protected Long id;

@TableField(value="create_date", fill = FieldFill.INSERT)
protected Date createDate;

/**
 * 更新日期<br>
 * @TableField注解说明:<br>
 * 
 * <h1>1、value属性:</h1>
 * 生成sql时,实体属性(例如modifyDate)对应数据库表的列名(表字段,例如modify_date)。<br>
 * 
 * <h1>2、fill属性:</h1>
 * 指定数据库表的字段的填充策略,各枚举值含义请自己看源码。<br>
 * 配置该属性,在执行insert、update等SQL时,如果策略匹配成功,就会在生成的SQL中自动追加新增、更新该字段的内容,<br>
 * 并且该字段的取值会通过MetaObjectHandler类的insertFill、updateFill等对应方法中的设置进行赋值。<br>
 * 如果通过该填充策略给数据库表字段自动填充值时,必须自己实现MetaObjectHandler抽象类,并注册到mybatis的全局配置中去。<br>
 * 请参考mybatis-plug自动填充功能:{@link https://mp.baomidou.com/guide/auto-fill-metainfo.html}<br>
 * springBoot的配置:{@link https://www.cnblogs.com/lqtbk/p/9843401.html}<br>
 * 本项目中MetaObjectHandler的实现类未:{@link com.stylefeng.guns.core.handler.ModelMetaObjectHandler}<br>
 * <b>注意:</b><br>
 * 如果该注解同时设置了“update属性”(见下),且fill属性取值为UPDATE或INSERT_UPDATE,那么fill属性优先级高于update属性,会导致设置的update属性策略失效!!!<br>
 * 
 * <h1>3、update属性:</h1>
 * 对实体进行update操作时,生成的update SQL,会注入该字段的更新。<br>
 * 例如:<br>
 * update="NOW()",则生成的SQL中会含“update ... set ..., modify_date = NOW()”<br>
 * update="%s+1",则生成的SQL中会含“update ... set ..., version = version + 1<br>
 * <b>注意:</b><br>
 * 如果该注解同时设置了“fill属性”(见上),且fill属性取值为UPDATE或INSERT_UPDATE,那么fill属性优先级高于update属性,会导致设置的update属性策略失效!!!<br>
 * 
 * <h1>优先级总结:</h1>
 * 实体属性更新到数据库时,属性值来源的优先级:实体类对象setter设置的值 &gt; fill策略填充的值 &gt; update策略SQL注入的值。<br>
 * <b>注意:</b><br>
 * setter优先级和fill策略优先级,是在MetaObjectHandler中自己手动实现的。
 */
@TableField(value="modify_date", fill = FieldFill.INSERT, update="NOW()")
protected Date modifyDate;

/**
 * @Version注解说明:<br>
 * 更新时,实体对象的version属性必须有值,才会生成SQL update ... WHERE ... and version=?
 */
@Version
@TableField(value="version", fill = FieldFill.INSERT, update="%s+1")
protected Long version;

}


// MetaObjectHandler中自己手动实现的 setter优先级和fill策略优先级
import java.util.Date;
import org.apache.ibatis.reflection.MetaObject;
import com.baomidou.mybatisplus.mapper.MetaObjectHandler;

/**

  • <p>

  • 默认填充器关闭操作

  • </p>

  • @author wsp@sunnybscom

  • @since 2018-12-05
    */
    public class ModelMetaObjectHandler extends MetaObjectHandler {

    /**

    • metaObject是页面传递过来的参数的包装对象,不是从数据库取的持久化对象,因此页面传过来哪些值,metaObject里就有哪些值。
      /
      @Override
      public void insertFill(MetaObject metaObject) {
      Date now = new Date();
      Object createDate = this.getFieldValByName("createDate", metaObject);
      if(null == createDate){
      /
      *
      * 设置实体属性setter进去的值,优先级要高于自动填充的值。
      * 如果实体没有设置该属性,就给默认值,防止entity的setter值被覆盖。
      */
      this.setFieldValByName("createDate", now, metaObject);
      }
      Object modifyDate = this.getFieldValByName("modifyDate", metaObject);
      if(null == modifyDate){
      this.setFieldValByName("modifyDate", now, metaObject);
      }
      Object version = this.getFieldValByName("version", metaObject);
      if(null == version){
      this.setFieldValByName("version", 0L, metaObject);
      }
      }

    @Override
    public void updateFill(MetaObject metaObject) {
    }


配置

Spring Boot application.yml

mybatis-plus:
typeAliasesPackage: com.stylefeng.guns.modular.system.model

枚举属性自动转换,支持统配符 * 或者 ; 分割

typeEnumsPackage: com.stylefeng.guns.modular.*.model.enums

自定义填充策略接口实现

global-config.meta-object-handler: com.stylefeng.guns.core.handler.ModelMetaObjectHandler
————————————————


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270