【Mybatis-Plus进阶学习(三)】自动填充
我们在实际开发中有些字段的值使用手动输入十分的不方便,例如创建时间,更改时间等。有的朋友说可以使用默认值,这是可以的,但同时具有局限性。这时候就需要使用MP的自动填充功能。
在本篇博客中,如果你遇到了乱码问题,可以在数据库连接池参数中添加如下属性,或者直接在数据库中更改编码方式。
characterEncoding=UTF-8
自动填充的简单使用
第一步:字段添加注释
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
第二步:填充处理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}
注意:
- creatTime和updateTime是User类的属性不是数据库的字段
- setInsertFieldValByName和setUpdateFieldValByName方法不能放错位置,不然不生效。setFieldValByName()可以在随意放置
自动填充优化
如上例,虽然可以实现自动填充,但是无论数据库是否有createTime字段都会被填充,是对资源的浪费,所以我需要进行优化,让其在有createTime字段的时候进行自动填充,没有的时候不填充。同样更新也做了相应的修改。update时,变量中如果有updateTime相应的值,就使用输入的变量的值,如果没有,就是用LocalDateTime.now()生成并填入,具体代码如下:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//数据库是否有这个字段,有就填充,没有就不填充
// boolean hasSetter = metaObject.hasSetter("createTime1");
boolean hasSetter = metaObject.hasSetter("createTime");
if (hasSetter) {
setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
//updateTime
Object updateTime = getFieldValByName("updateTime", metaObject);
if (updateTime == null) {
setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}
}
MetaObject是元对象,这里可以初步理解为被操作的数据源的对象,里面包括数据元的各种参数。
分类:
【从零开始学Mybatis笔记】
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· 盘点!HelloGitHub 年度热门开源项目
· DeepSeek V3 两周使用总结
· 02现代计算机视觉入门之:什么是视频
· C#使用yield关键字提升迭代性能与效率
· 回顾我的软件开发经历(1)