在使用了Mybatis Plus框架进行项目重构之后,关于如何更好的利用Mybatis plus。在此做一些总结供大家参考。
主要总结了以下这几个方面的实践。
- 基础设计
- BaseEntity
- 逻辑删除
- 自动填充字段
- 代码生成类
- 查询操作
- Query基类(复用+PageQuery)
- 普通Query
- Lambda Query
- 复杂多表查询
- 报表型查询
- 保存操作
- 模型利用JPA保存
- 批量保存数据
- 扩展
- 阻止全表操作
- 动态数据源
- 多租户
详细代码实现在开源项目Agileboot中:https://github.com/valarchie/AgileBoot-Back-End
关于Mybatis Plus的实践,如有不足或者建议欢迎大家评论指正。
废话不多说进入正题。
基础设计
BaseEntity
对于数据库中表中的公共字段我们可以抽取出来做成基类继承。避免表映射的数据库实体类字段太过繁杂。
例如常用的创建时间、创建者、更新时间、更新者、逻辑删除字段。
/**
* Entity基类
*
* @author valarchie
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class BaseEntity<T extends Model<?>> extends Model<T> {
@ApiModelProperty("创建者ID")
@TableField(value = "creator_id", fill = FieldFill.INSERT)
private Long creatorId;
@ApiModelProperty("创建时间")
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
@ApiModelProperty("更新者ID")
@TableField(value = "updater_id", fill = FieldFill.UPDATE, updateStrategy = FieldStrategy.NOT_NULL)
private Long updaterId;
@ApiModelProperty("更新时间")
@TableField(value = "update_time", fill = FieldFill.UPDATE)
private Date updateTime;
/**
* deleted字段请在数据库中 设置为tinyInt 并且非null 默认值为0
*/
@ApiModelProperty("删除标志(0代表存在 1代表删除)")
@TableField("deleted")
@TableLogic
private Boolean deleted;
}
通过继承了基类,实体类看起来就简洁了许多。
/**
* <p>
* 通知公告表
* </p>
*
* @author valarchie
* @since 2022-10-02
*/
@Getter
@Setter
@TableName("sys_notice")
@ApiModel(value = "SysNoticeEntity对象", description = "通知公告表")
public class SysNoticeEntity extends BaseEntity<SysNoticeEntity> {
private static final long serialVersionUID = 1L;
@ApiModelProperty("公告ID")
@TableId(value = "notice_id", type = IdType.AUTO)
private Integer noticeId;
@ApiModelProperty("公告标题")
@TableField("notice_title")
private String noticeTitle;
@ApiModelProperty("公告类型(1通知 2公告)")
@TableField("notice_type")
private Integer noticeType;
@ApiModelProperty("公告内容")
@TableField("notice_content")
private String noticeContent;
@ApiModelProperty("公告状态(1正常 0关闭)")
@TableField("`status`")
private Integer status;
@ApiModelProperty("备注")
@TableField("remark")
private String remark;
@Override
public Serializable pkVal() {
return this.noticeId;
}
}
既然抽取出了公共字段,我们可以更进一步将这些公共字段进行自动填值处理。
Mybatis Plus提供了字段自动填充的插件。
自动填充字段
/**
* Mybatis Plus允许在插入或者更新的时候
* 自定义设定值
* @author valarchie
*/
@Component
@Slf4j
public class CustomMetaObjectHandler implements MetaObjectHandler {
public static final String CREATE_TIME_FIELD = "createTime";
public static final String CREATOR_ID_FIELD = "creatorId";
pu