美文网首页Java 杂谈Java
Mybatis实现审计数据自动填充

Mybatis实现审计数据自动填充

作者: SevenLin1993 | 来源:发表于2019-07-24 18:52 被阅读2次

    Mybatis实现审计数据自动填充

    在使用Spring Data JPA的时候,框架层面已经提供了审计数据相关的入口,所以只需通过配置就可以实现审计数据的自动维护

    Spring Data JPA审计数据配置

    四个注解
    • @CreatedDate,创建时间
    • @CreatedBy,创建人
    • @LastModifiedDate,最后修改时间
    • @LastModifiedBy,最后修改人

    Sample:

    @Column(name = "created_date", nullable = false, updatable = false)
    @CreatedDate
    private Date createdDate;
    
    @Column(name = "modified_by")
    @LastModifiedBy
    private String modifiedBy;
    
    启用配置
    • 启用审计@EnableJpaAuditing
    • 配置AuditorProvider
    @Configuration
    @EnableJpaAuditing
    public class JpaConfiguration{
        
        @Bean
        public AuditorAware<String> auditorProvider() {
            return new MyAuditor();
        }
       
        /**
         * 自定义AuditorAware,获取当前用户名
         */
        public static class MyAuditor implements AuditorAware<String> {
            @Override
            public String getCurrentAuditor() {
                //获取用户名,如果使用SpringSecurity的话可以从SecurityContext中获取
            }
        }
        
    }
    

    使用Mybatis实现审计数据自动填充

    而在使用Mybatis的时候,Mybatis提倡的是简单,官方也没有类似的功能,这个时候如果业务需要审计数据的时候需要手工维护,这时候可以模仿JPA实现一个类似的功能,如下:

    使用Mybatis Plus插件
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>${version}</version>
    </dependency>
    
    自定义实现自动填充Handler
    public class AuditMetaObjectHandler extends MetaObjectHandler {
    
        @Override
        public void insertFill(MetaObject metaObject) {
            boolean createDate = metaObject.hasSetter("createDate");
            boolean updateDate = metaObject.hasSetter("updateDate");
            if (createDate || updateDate) {
                Date now = new Date();
                if (createDate) {
                    this.setFieldValByName("createDate", now, metaObject);
                }
                if (updateDate) {
                    this.setFieldValByName("updateDate", now, metaObject);
                }
            }
            String username = ...;//获取用户,如果使用SpringSecurity的话可以从SecurityContext中获取
            if (metaObject.hasSetter("createUser")) {
                this.setFieldValByName("createUser", username, metaObject);
            }
            if (metaObject.hasSetter("updateUser")) {
                this.setFieldValByName("updateUser", username, metaObject);
            }
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            if (metaObject.hasSetter("updateDate")) {
                this.setFieldValByName("updateDate", new Date(), metaObject);
            }
            if (metaObject.hasSetter("updateUser")) {
                String username = ...;//获取用户,如果使用SpringSecurity的话可以从SecurityContext中获取
                this.setFieldValByName("updateUser", username, metaObject);
            }
        }
    }
    
    启用配置

    在MybatisPlusConfigurer配置中新增配置:

    /**
    * 审计数据插件
    *
    * @return AuditMetaObjectHandler
    */
    @Bean
    @ConditionalOnMissingBean(name = "auditMetaObjectHandler")
    public AuditMetaObjectHandler auditMetaObjectHandler() {
        return new AuditMetaObjectHandler();
    }
    
    配置实体类
    /**
      * 创建时间
      */
    @TableField(value = "create_date", fill = FieldFill.INSERT)
    private Date createDate;
    
    /**
      * 创建用户
      */
    @TableField(value = "create_user", fill = FieldFill.INSERT)
    private String createUser;
    
    /**
     * 更新时间
     */
    @TableField("update_date", fill = FieldFill.INSERT_UPDATE)
    private Date updateDate;
    
    /**
     * 更新用户
     */
    @TableField("update_user", fill = FieldFill.INSERT_UPDATE)
    private String updateUser;
    
    

    总结

    这样就可以实现类似Spring Data JPA的审计功能

    参考

    相关文章

      网友评论

        本文标题:Mybatis实现审计数据自动填充

        本文链接:https://www.haomeiwen.com/subject/mvpfrctx.html