当前位置:   article > 正文

使用Mybatis-Plus实现对象属性自动填充功能_mybatis-plus存储对象的属性

mybatis-plus存储对象的属性

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

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

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

1、引用Mybatis-plus

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-boot-starter</artifactId>
  5. <version>3.0.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.h2database</groupId>
  9. <artifactId>h2</artifactId>
  10. <scope>runtime</scope>
  11. </dependency>
  12. </dependencies>

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

  1. /**
  2. * Copyright © 2019 DBRG. All rights reserved.
  3. *
  4. * @Title: DbrgMetaObjectHandler.java
  5. * @Prject: syswms
  6. * @Package: com.dbrg.project.handler
  7. * @version: V1.0
  8. */
  9. package com.dbrg.project.handler;
  10. import org.apache.ibatis.reflection.MetaObject;
  11. import org.springframework.stereotype.Component;
  12. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  13. import com.dbrg.common.utils.DateUtils;
  14. import com.dbrg.common.utils.security.ShiroUtils;
  15. /**
  16. * @ClassName: DbrgMetaObjectHandler
  17. * @Description:元对象自动填充处理器
  18. * @author: yelangking
  19. * @date: 2019年3月4日 上午9:14:18
  20. */
  21. @Component
  22. public class DbrgMetaObjectHandler implements MetaObjectHandler{
  23. private static final String CREATE_BY_FIELD_NAME = "createBy";
  24. private static final String CREATE_TIME_FIELD_NAME = "createTime";
  25. private static final String UPDATE_BY_FIELD_NAME = "updateBy";
  26. private static final String UPDATE_TIME_FIELD_NAME = "updateTime";
  27. /* (non Javadoc)
  28. * @Title: insertFill
  29. * @Description: {简单描述}
  30. * @param arg0
  31. * @see com.baomidou.mybatisplus.core.handlers.MetaObjectHandler#insertFill(org.apache.ibatis.reflection.MetaObject)
  32. */
  33. @Override
  34. public void insertFill(MetaObject metaObject) {
  35. //1、自动设置创建人信息,当外部接口调用时,用户可能为空
  36. if(null != ShiroUtils.getSysUser()){
  37. this.setFieldValByName(CREATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject);
  38. }
  39. //2、自动设置创建时间
  40. this.setFieldValByName(CREATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject);
  41. //3、自动设置更新人信息,当外部接口调用时,用户可能为空
  42. if(null != ShiroUtils.getSysUser()){
  43. this.setFieldValByName(UPDATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject);
  44. }
  45. //4、自动设置更新时间
  46. this.setFieldValByName(UPDATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject);
  47. }
  48. /* (non Javadoc)
  49. * @Title: updateFill
  50. * @Description: {简单描述}
  51. * @param arg0
  52. * @see com.baomidou.mybatisplus.core.handlers.MetaObjectHandler#updateFill(org.apache.ibatis.reflection.MetaObject)
  53. */
  54. @Override
  55. public void updateFill(MetaObject metaObject) {
  56. //1、自动设置更新人信息,当外部接口调用时,用户可能为空
  57. if(null != ShiroUtils.getSysUser()){
  58. this.setFieldValByName(UPDATE_BY_FIELD_NAME,ShiroUtils.getUserId(),metaObject);
  59. }
  60. //2、自动设置更新时间
  61. this.setFieldValByName(UPDATE_TIME_FIELD_NAME, DateUtils.getNowDate(), metaObject);
  62. }
  63. }

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

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

  1. /**
  2. * Copyright © 2019 DBRG. All rights reserved.
  3. *
  4. * @Title: MpBaseEntity.java
  5. * @Prject: syswms
  6. * @Package: com.dbrg.framework.web.domain
  7. * @version: V1.0
  8. */
  9. package com.dbrg.framework.web.domain;
  10. import java.io.Serializable;
  11. import java.util.Date;
  12. import com.baomidou.mybatisplus.annotation.FieldFill;
  13. import com.baomidou.mybatisplus.annotation.TableField;
  14. import com.fasterxml.jackson.annotation.JsonFormat;
  15. import lombok.AllArgsConstructor;
  16. import lombok.Getter;
  17. import lombok.NoArgsConstructor;
  18. import lombok.Setter;
  19. /**
  20. * @ClassName: MpBaseEntity
  21. * @Description:mybatis plus 自动注入基类,结合FieledFill策略类一起使用,
  22. * 默认包含创建人、创建时间、更新人、更新时间信息,业务表单中包含此字段的集成本类即可。如无明确要求,可不做任何处理。
  23. * @author: yelangking
  24. * @date: 2019年3月4日 上午9:03:12
  25. */
  26. @Setter
  27. @Getter
  28. @NoArgsConstructor
  29. @AllArgsConstructor
  30. public class MpBaseEntity implements Serializable{
  31. private static final long serialVersionUID = 2234596156219712753L;
  32. /**
  33. * 创建人
  34. */
  35. @TableField(value="create_by",fill=FieldFill.INSERT)
  36. private Long createBy;
  37. /** 创建时间 */
  38. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  39. @TableField(value="create_time",fill=FieldFill.INSERT)
  40. private Date createTime;
  41. /**
  42. * 更新人
  43. */
  44. @TableField(value="update_by",fill=FieldFill.INSERT_UPDATE)
  45. private Long updateBy;
  46. /**
  47. * 更新时间
  48. */
  49. @TableField(value="update_time",fill=FieldFill.INSERT_UPDATE)
  50. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  51. private Date updateTime;
  52. }

关键代码: 

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/434522
推荐阅读
相关标签
  

闽ICP备14008679号