使用Mybatis-Plus实现对象属性自动填充功能

 更新时间:2024年01月22日 10:33:32   作者:夜郎king  
这篇文章主要介绍了如何使用Mybatis-Plus实现对象属性自动填充功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,感兴趣的朋友们下面随着小编来一起来学习吧

案例场景:在设计一张数据库表的时候,通常会包含下列信息:createBy(创建人)、createTime(创建时间)、updateBy(修改人)、updateTime(修改时间)、otherinfo(其它属性信息)。

在一般的业务逻辑编写过程中,绝大多数的开发工程师都选择根据操作类型(insert/update)来依次调用对应的setXXX方法来设置值。使用setXXX并不是不能达到预期,只是代码实现起来不叫臃肿,而这些字段几乎是通用的字段,是否有统一的方式进行设置呢?

下面以实例的方式告诉大家,如何基于Mybatis-Plus实现固定列自动填充,让你的工作效率提升。

1、引用Mybatis-plus

<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.6</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

2、自定义自己的原对象属性填充器,自定义类实现MetaObjectHandler,代码如下:

/**   
 * Copyright © 2019 DBRG. All rights reserved.
 * 
 * @Title: DbrgMetaObjectHandler.java 
 * @Prject: syswms
 * @Package: com.dbrg.project.handler 
 * @version: V1.0   
 */
package com.dbrg.project.handler;
 
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
 
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.dbrg.common.utils.DateUtils;
import com.dbrg.common.utils.security.ShiroUtils;
 
/** 
 * @ClassName: DbrgMetaObjectHandler 
 * @Description:元对象自动填充处理器
 * @author: yelangking
 * @date: 2019年3月4日 上午9:14:18  
 */
@Component
public class DbrgMetaObjectHandler implements MetaObjectHandler{
  private static final String CREATE_BY_FIELD_NAME = "createBy";
  private static final String CREATE_TIME_FIELD_NAME = "createTime";
  private static final String UPDATE_BY_FIELD_NAME = "updateBy";
  private static final String UPDATE_TIME_FIELD_NAME = "updateTime";
 
  /* (non Javadoc) 
   * @Title: insertFill
   * @Description: {简单描述}
   * @param arg0 
   * @see com.baomidou.mybatisplus.core.handlers.MetaObjectHandler#insertFill(org.apache.ibatis.reflection.MetaObject) 
   */
  @Override
  public void insertFill(MetaObject metaObject) {
    //1、自动设置创建人信息,当外部接口调用时,用户可能为空
    if(null != ShiroUtils.getSysUser()){
      this.setFieldValByName(CREATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject);
    }
    //2、自动设置创建时间
    this.setFieldValByName(CREATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject);
    //3、自动设置更新人信息,当外部接口调用时,用户可能为空
    if(null != ShiroUtils.getSysUser()){
      this.setFieldValByName(UPDATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject);
    }
    //4、自动设置更新时间
    this.setFieldValByName(UPDATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject);
  }
 
  /* (non Javadoc) 
   * @Title: updateFill
   * @Description: {简单描述}
   * @param arg0 
   * @see com.baomidou.mybatisplus.core.handlers.MetaObjectHandler#updateFill(org.apache.ibatis.reflection.MetaObject) 
   */
  @Override
  public void updateFill(MetaObject metaObject) {
    //1、自动设置更新人信息,当外部接口调用时,用户可能为空
    if(null != ShiroUtils.getSysUser()){
      this.setFieldValByName(UPDATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject);
    }
    //2、自动设置更新时间
    this.setFieldValByName(UPDATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject);
  }
}

以上代码实现了自定义的设置入口,分别定义了在insert和update时设置哪些属性的值,程序实际运行时会根据不同的操作类型设置相应的值。

3、在实体类上注入设置填充规则,代码如下:

 
/**   
 * Copyright © 2019 DBRG. All rights reserved.
 * 
 * @Title: MpBaseEntity.java 
 * @Prject: syswms
 * @Package: com.dbrg.framework.web.domain 
 * @version: V1.0   
 */
package com.dbrg.framework.web.domain;
 
import java.io.Serializable;
import java.util.Date;
 
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
 
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
 
/** 
 * @ClassName: MpBaseEntity 
 * @Description:mybatis plus 自动注入基类,结合FieledFill策略类一起使用,
 * 默认包含创建人、创建时间、更新人、更新时间信息,业务表单中包含此字段的集成本类即可。如无明确要求,可不做任何处理。
 * @author: yelangking
 * @date: 2019年3月4日 上午9:03:12  
 */
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class MpBaseEntity implements Serializable{
  private static final long serialVersionUID = 2234596156219712753L;
  /**
   * 创建人
   */
  @TableField(value="create_by",fill=FieldFill.INSERT)
  private Long createBy;
  /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value="create_time",fill=FieldFill.INSERT)
  private Date createTime;
    /**
     * 更新人
     */
    @TableField(value="update_by",fill=FieldFill.INSERT_UPDATE)
    private Long updateBy;
    /**
     * 更新时间
     */
    @TableField(value="update_time",fill=FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
}

关键代码: 

@TableField(value="update_time",fill=FieldFill.INSERT_UPDATE),在对象的属性上设置填充规则即可。

4、运行效果,参考官网运行结果。

c.b.samples.metainfo.AutoFillTest : Started AutoFillTest in 9.239 seconds (JVM running for 17.064)
c.b.s.m.handler.MyMetaObjectHandler: start insert fill ....
c.b.s.metainfo.mapper.UserMapper.insert: ==> Preparing: INSERT INTO user ( ID, NAME, AGE, EMAIL, OPERATOR ) VALUES ( ?, ?, ?, ?, ? )
c.b.s.metainfo.mapper.UserMapper.insert: ==> Parameters: 1381223322590720001(Long), Tom(String), 1(Integer), tom@qq.com(String), Jetty(String)
c.b.s.metainfo.mapper.UserMapper.insert: <== Updates: 1
c.b.s.m.mapper.UserMapper.selectById: ==>  Preparing: SELECT ID,NAME,AGE,EMAIL,OPERATOR FROM user WHERE ID=?
c.b.s.m.mapper.UserMapper.selectById: ==> Parameters: 1381223322590720001(Long)
c.b.s.m.mapper.UserMapper.selectById: <== Total: 1
c.b.samples.metainfo.AutoFillTest: query user:User(id=1381223322590720001, name=Tom, age=1, email=tom@qq.com, operator=Jetty)
c.b.s.m.mapper.UserMapper.selectById: ==> Preparing: SELECT ID,NAME,AGE,EMAIL,OPERATOR FROM user WHERE ID=?
c.b.s.m.mapper.UserMapper.selectById: ==> Parameters: 1(Long)
c.b.s.m.mapper.UserMapper.selectById: <== Total: 1
c.b.samples.metainfo.AutoFillTest: before user:User(id=1, name=Jone, age=18, email=test1@baomidou.com, operator=test)
c.b.s.m.handler.MyMetaObjectHandler : start update fill ....
c.b.s.m.mapper.UserMapper.updateById: ==> Preparing: UPDATE user SET NAME=?, AGE=?, EMAIL=?, OPERATOR=? WHERE ID=?
c.b.s.m.mapper.UserMapper.updateById: ==> Parameters: Jone(String), 12(Integer), test1@baomidou.com(String), test(String), 1(Long)
c.b.s.m.mapper.UserMapper.updateById: <==   Updates: 1

5、综上所述,使用mybatis-plus可以方便快速的进行属性自动填充,最大量的减轻大家的工作量,在你的项目中大胆采用吧,提升开发效率。欢迎添加公众号交流。

以上就是使用Mybatis-Plus实现对象属性自动填充功能的详细内容,更多关于Mybatis-Plus对象属性自动填充的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot获取maven打包时间的两种方式

    SpringBoot获取maven打包时间的两种方式

    这篇文章主要介绍了SpringBoot获取maven打包时间的两种方式,文章通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-05-05
  • 解决Spring中@Value注解取值为null问题

    解决Spring中@Value注解取值为null问题

    近期应用中因业务迭代需要接入 user 客户端,接入后总是启动失败,报注册 user bean 依赖的配置属性为 null,所以接下来小编就和大家一起排查分析这个问题,感兴趣的小伙伴跟着小编一起来看看吧
    2023-08-08
  • Java 使用maven实现Jsoup简单爬虫案例详解

    Java 使用maven实现Jsoup简单爬虫案例详解

    这篇文章主要介绍了Java 使用maven实现Jsoup简单爬虫案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Kotlin修饰符lateinit(延迟初始化)案例详解

    Kotlin修饰符lateinit(延迟初始化)案例详解

    这篇文章主要介绍了Kotlin修饰符lateinit(延迟初始化)案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • java gui详解贪吃蛇小游戏实现流程

    java gui详解贪吃蛇小游戏实现流程

    刚开始学JAVA GUI,就练手写了一个小时候经常在诺基亚上玩的一个小游戏__贪吃蛇.做的比较简单,但还是可以玩的.感兴趣的朋友快来看看吧
    2021-11-11
  • java servlet结合Oracle搭建java的web开发环境

    java servlet结合Oracle搭建java的web开发环境

    今天我将与大家分享一下我学JAVA WEB写的一些小实例 ,我个人是不太喜欢书本上的晦涩的概念的,所以我花了更多的时间在一些应用实例上,我觉得这样的学习方式很适合我,由简到繁,由浅入深
    2015-12-12
  • Spring底层核心源码原理解析

    Spring底层核心源码原理解析

    这篇文章主要介绍了Spring底层核心源码原理解析,当在某个方法上加了@Transactional注解后,就表示该方法在调用时会开启Spring事务,而这个方法所在的类所对应的Bean对象会是该类的代理对象,需要的朋友可以参考下
    2023-09-09
  • 详解Java中StringBuffer类常用方法

    详解Java中StringBuffer类常用方法

    这篇文章主要为大家介绍了java中StringBuffer类常用方法
    2016-01-01
  • mybatis plus乐观锁及实现详解

    mybatis plus乐观锁及实现详解

    这篇文章主要为大家介绍了mybatis plus乐观锁及实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • java设计模式学习之简单工厂模式

    java设计模式学习之简单工厂模式

    这篇文章主要为大家详细介绍了java设计模式学习之简单工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论