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 [email protected](邮箱) * * 修改记录 * @version 产品版本信息 2018-12-06 姓名(邮箱) 修改信息
* */ @SuppressWarnings("rawtypes") public abstract class BaseEntity 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; /** * 更新日期
* @TableField注解说明:
* *

1、value属性:

* 生成sql时,实体属性(例如modifyDate)对应数据库表的列名(表字段,例如modify_date)。
* *

2、fill属性:

* 指定数据库表的字段的填充策略,各枚举值含义请自己看源码。
* 配置该属性,在执行insert、update等SQL时,如果策略匹配成功,就会在生成的SQL中自动追加新增、更新该字段的内容,
* 并且该字段的取值会通过MetaObjectHandler类的insertFill、updateFill等对应方法中的设置进行赋值。
* 如果通过该填充策略给数据库表字段自动填充值时,必须自己实现MetaObjectHandler抽象类,并注册到mybatis的全局配置中去。
* 请参考mybatis-plug自动填充功能:{@link https://mp.baomidou.com/guide/auto-fill-metainfo.html}
* springBoot的配置:{@link https://www.cnblogs.com/lqtbk/p/9843401.html}
* 本项目中MetaObjectHandler的实现类未:{@link com.stylefeng.guns.core.handler.ModelMetaObjectHandler}
* 注意:
* 如果该注解同时设置了“update属性”(见下),且fill属性取值为UPDATE或INSERT_UPDATE,那么fill属性优先级高于update属性,会导致设置的update属性策略失效!!!
* *

3、update属性:

* 对实体进行update操作时,生成的update SQL,会注入该字段的更新。
* 例如:
* update="NOW()",则生成的SQL中会含“update ... set ..., modify_date = NOW()”
* update="%s+1",则生成的SQL中会含“update ... set ..., version = version + 1
* 注意:
* 如果该注解同时设置了“fill属性”(见上),且fill属性取值为UPDATE或INSERT_UPDATE,那么fill属性优先级高于update属性,会导致设置的update属性策略失效!!!
* *

优先级总结:

* 实体属性更新到数据库时,属性值来源的优先级:实体类对象setter设置的值 > fill策略填充的值 > update策略SQL注入的值。
* 注意:
* setter优先级和fill策略优先级,是在MetaObjectHandler中自己手动实现的。 */ @TableField(value="modify_date", fill = FieldFill.INSERT, update="NOW()") protected Date modifyDate; /** * @Version注解说明:
* 更新时,实体对象的version属性必须有值,才会生成SQL update ... WHERE ... and version=? */ @Version @TableField(value="version", fill = FieldFill.INSERT, update="%s+1") protected Long version; }

 

import java.util.Date;
import org.apache.ibatis.reflection.MetaObject;
import com.baomidou.mybatisplus.mapper.MetaObjectHandler;

/**
 * 

* 默认填充器关闭操作 *

* * @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

Mybatis-Plus公共字段自动填充注解使用说明@TableField、@Version_第1张图片

Mybatis-Plus公共字段自动填充注解使用说明@TableField、@Version_第2张图片

你可能感兴趣的:(Java基础)