Skip to content

baseEntity及自动填充

概述

业务数据表设计的时候大部分都存在公共字段,例如创建时间修改时间创建者更新者等等,如果对每张表都进行手动设置,则很容易错加、漏加。所以,可采用MybatisPlus自动填充公共字段的策略,公共字段由MybatisPlus自动插入和更新,业务代码无需处理。

快速上手

1、在业务模块的pom文件中添加依赖:

html
<dependency>
    <groupId>com.hisense.pangea</groupId>
    <artifactId>pangea-common-mybatis</artifactId>
    <version>${pangea.version}</version>
</dependency>

2、Entity实体类继承BaseEntity父类:

jsx
@Data
@TableName(value = "Demo")
public class DemoEntity extends BaseEntity {  //Entity实体类需要继承BaseEntity父类
    //此处可添加属性值
}

源码解析

1.基础实体BaseEntity中定义了需要处理的公共字段,包含创建者创建时间更新者更新时间备注供其他业务实体类继承:

jsx
@EqualsAndHashCode(callSuper = true)
@Data
public class BaseEntity extends BaseObject {
 
    /**
     * 创建者
     */
    @TableField(fill = FieldFill.INSERT)
    private String createdBy;
 
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)
    private Date createdDate;
 
    /**
     * 更新者
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String modifiedBy;
 
    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date modifiedDate;
 
 
    /**
     * 备注字段
     */
    private String remark;
}

注意

创建时间和更新时间上面的JsonFormat注解可以决定返回日期的格式,如果没有返回2020-12-17这样已经设定的形式, 而返回时间戳,那么可以在实体类中重写该字段,注解改为@JSONField(format = "yyyy-MM-dd HH:mm:ss")。

2.在需要自动填充的部分加入@TableField(fill = FieldFill.INSERT)注解:

字段填充策略 FieldFill

描述
DEFAULT默认不处理
INSERT仅insert时填充
UPDATE仅update时填充
INSERT_UPDATEinsert,update时填充

在进行插入(insert)操作时对添加了注解@TableField(fill = FieldFill.INSERT)的字段进行自动填充,对添加了注解@TableField(fill = FieldFill.INSERT_UPDATE)的字段在进行插入(insert)和更新(update)时进行自动填充。因此,在具体业务中对实体类进行赋值就可以不用对这些公共字段进行赋值,在执行插入或者更新时就能自动赋值并插入数据库。

注意事项

  • 前提:在使用mybatis plus自动填充功能时,没有使用@Mapper注解,而是自定义的Mapper.xml
  • 问题:使用自定义的Mapper.xml中写的语句在填充数据时不生效。
  • 解决方案:

1.检查Entity实体类是否继承pangea-common-mybatis包中的BaseEntity父类:

jsx
import com.hisense.pangea.mybatis.entity.BaseEntity;
 
@Data
public class SysMenu extends BaseEntity {  //Entity实体类需要继承BaseEntity父类
}

2.检查Mapper是否继承BaseMapper父类:

jsx
import com.hisense.pangea.core.BaseMapper;
 
public interface SysMenuMapper extends BaseMapper<SysMenu> {
}

3.在Mapper.xml中写插入语句:

xml
    <insert id="insertMenu" parameterType="SysMenu">
        insert into sys_menu
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null and id != 0">id,</if>
            <if test="menuName != null and menuName != ''">menu_name,</if>
            <if test="parentCode != null and parentCode != ''">parent_code,</if>
            <if test="orderNum != null and orderNum != ''">order_num,</if>
            <if test="menuType != null and menuType != ''">menu_type,</if>
            <if test="target != null and target != ''">target,</if>
            <if test="menuCode != null and menuCode != ''">menu_code,</if>
            <if test="component != null and component != ''">component ,</if>
            <if test="pageCode !=null">page_code,</if>
            <if test="visible != null">visible,</if>
            <if test="perms !=null and perms != ''">perms,</if>
            <if test="icon != null and icon != ''">icon,</if>
            <if test="shortCut != null and shortCut != ''">short_cut,</if>
            <if test="systemName != null and systemName != ''">system_name,</if>
            <if test="path !=null and path != ''">path,</if>
            <if test="redirect !=null and redirect != ''">redirect,</if>
            <if test="hiddenChildren !=null">hidden_children,</if>
            <if test="hiddenHeader !=null">hidden_header,</if>
            <if test="remark != null and remark != ''">remark,</if>
            <!-- 插入时,需要填写自动填充的字段,建议配置在语句的最后位置,防止发生语法错误-->
            created_by,
            created_date,
            modified_by,
            modified_date
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null and id != 0">#{id},</if>
            <if test="menuName != null and menuName != ''">#{menuName},</if>
            <if test="parentCode != null and parentCode != ''">#{parentCode},</if>
            <if test="orderNum != null and orderNum != ''">#{orderNum},</if>
            <if test="menuType != null and menuType != ''">#{menuType},</if>
            <if test="target != null and target != ''">#{target},</if>
            <if test="menuCode != null and menuCode != ''">#{menuCode},</if>
            <if test="component != null and component != ''">#{component},</if>
            <if test="pageCode !=null">#{pageCode},</if>
            <if test="visible != null">#{visible},</if>
            <if test="perms !=null and perms != ''">#{perms},</if>
            <if test="icon != null and icon != ''">#{icon},</if>
            <if test="shortCut != null and shortCut != ''">#{shortCut},</if>
            <if test="systemName != null and systemName != ''">#{systemName},</if>
            <if test="path !=null and path != ''">#{path},</if>
            <if test="redirect !=null and redirect != ''">#{redirect},</if>
            <if test="hiddenChildren !=null">#{hiddenChildren},</if>
            <if test="hiddenHeader !=null">#{hiddenHeader},</if>
            <if test="remark != null and remark != ''">#{remark},</if>
            <!-- 插入时,需要填写自动填充的字段(创建者,创建时间,更新者,更新时间)-->
            #{createdBy},
            #{createdDate},
            #{modifiedBy},
            #{modifiedDate}
        </trim>
    </insert>

4.在Mapper.xml中写修改语句:

xml
    <update id="updateMenu" parameterType="SysMenu">
        update sys_menu
        <trim prefix="SET" suffixOverrides=",">
            <if test="menuName != null and menuName != ''">menu_name = #{menuName},</if>
            <if test="parentCode != null and parentCode != ''">parent_code = #{parentCode},</if>
            <if test="orderNum != null and orderNum != ''">order_num = #{orderNum},</if>
            <if test="menuType != null and menuType != ''">menu_type = #{menuType},</if>
            <if test="target != null">target = #{target},</if>
            <if test="menuCode != null and menuCode != ''">menu_code = #{menuCode},</if>
            <if test="component != null">component = #{component},</if>
            <if test="visible != null">visible = #{visible},</if>
            <if test="perms !=null">perms = #{perms},</if>
            <if test="pageCode !=null">page_code = #{pageCode},</if>
            <if test="icon !=null">icon = #{icon},</if>
            <if test="shortCut !=null and shortCut != ''">short_cut = #{shortCut},</if>
            <if test="systemName !=null and systemName != ''">system_name = #{systemName},</if>
            <if test="path !=null">path = #{path},</if>
            <if test="redirect !=null">redirect = #{redirect},</if>
            <if test="hiddenChildren !=null">hidden_children = #{hiddenChildren},</if>
            <if test="hiddenHeader !=null">hidden_header = #{hiddenHeader},</if>
            <if test="remark != null and remark != ''">remark = #{remark},</if>
            <!-- 修改时,需要填写自动填充的字段,建议配置在语句的最后位置,防止发生语法错误-->
            modified_by= #{modifiedBy},
            modified_date= #{modifiedDate}
        </trim>
        where id = #{id}
    </update>

注意

自定义的SQL不能使用if!=null的判断,因为数据是在语句执行完之后填充的。