👨🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
接下来的这几期,bug菌想跟大家分享一下自己昨天刚接到一个临时的需求,热乎着呢,想分享一下自己是如何面对临时需求并制定整个开发周期,其中包括从梳理业务到创建业务表再到实现业务逻辑形成闭环再到与前端对接,其中会穿插一些业务拓展及功能性拓展,这一条龙流程在线与大家一起见证,分享给刚入门的小伙伴,希望对你们有所帮助。
环境说明:idea2019.3 + springboot2.3.1.REALSE + mybati-plus3.2.0 + mysql5.6 + jdk1.8
上一期提到那通过实体类的自动注入,这期我就来给大家讲讲啦,我要带着大家避免重复造轮子,采用了mp(mybatis-plus)所提供的自动填充策略。mp它是有封装了一套可供多选的自动填充策略方案。不比你手动造的香么?至于如何使用,这个也简单的。
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
在你需要自动填充的字段加上注解。比如就如上BaseEntity这个通用类。我们逐一加上对应的注解。具体添加如下:
/**
* id 生成策略为UUID
*/
@TableId(value = "id",type = IdType.UUID)
private String id;
/**
* 创建时间 填充策略为插入自动填充
*/
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(value = "create_time",fill = FieldFill.INSERT)
protected Date createTime;
/**
* 创建者 填充策略为插入自动填充
*/
@ApiModelProperty(value = "创建人")
@TableField(value = "create_by",fill = FieldFill.INSERT)
protected String createBy;
/**
* 更新时间 填充策略为新增或更新自动填充
*/
@ApiModelProperty(value = "修改时间")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
protected Date updateTime;
/**
* 更新者 填充策略为新增或更新自动填充
*/
@ApiModelProperty(value = "修改人")
@TableField(value = "update_by",fill = FieldFill.INSERT_UPDATE)
protected
没有这一步,自动填充功能肯定是不行的,如下我就给大家讲解一下,如何实现填充器?
你只需要按如下代码,具体实现insertFill()跟 updateFile() 接口即可。 这分别代表你的insert、update方法触发执行时所会进行的字段填充策略。
/**
* 自动补充插入或更新时的值
*
* @author luoYong
* @date
@Component
public class MpMetaObjectHandler implements MetaObjectHandler {
/**
* 插入-填充策略
*
* @param
@SneakyThrows
@Override
public void insertFill(MetaObject metaObject) {
//获取当前登录人信息
SysUserEntity user = SpringServletContextUtils.getUser();
this.setFieldValByName("createBy", user.getAccountId(), metaObject);
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateBy", user.getAccountId(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
/**
* 更新-填充策略
*
* @param
@SneakyThrows
@Override
public void updateFill(MetaObject metaObject) {
//获取当前登录人信息
SysUserEntity user = SpringServletContextUtils.getUser();
this.setFieldValByName("updateBy", user.getAccountId(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
对于加了通用字段的都支持自动填充,即对于sys_questions表所对应的实体我们将直接继承BaseEntity类即可,只要是insert、update等相关插入、修改方法执行时就不需要再管这些通用字段的赋值问题了,都会自动通过MpMetaObjectHandler执行器替我们赋值。这是不是非常的简便好使啊,小伙伴们。
其次还有一点需要注意的就是,你这么设置,就要注意在你获取用户信息的时候,我是通过t登录生成token令牌从缓存中获取对于用户的userInfo;若对于开放接口(白名单)而言,它就是支持免登录通过接口调取,那你就得注意获取用户信息是否支持了,如不支持那就你的实体最好就不要用自动填充,也就是不继承BaseEntity,自己在实体单独加上那些字段或者额外封装个通用实体类但不加mp的填充注解,这样也是可以的。
所以提醒下这一块大家需要注意,我就是因为踩坑啦。然后对于继承了BaseEntity又无法获取用户信息的,目前我也是没有办法避免它也会执行这个字段注入,发现个最笨的方法就是徒手写sql,在持久层定义mapper方法;虽然啊这方案比较low,但是能有效解决目前问题的,你们可以参考下,如果你们有发现别的更优雅简便的方式欢迎评论区告知我呀。