使用MyBatisPlus实现自动填充数据功能

在项目的开发中时常会有一些相似规律的字段需要在保存或者新增的时候填充一些数据进去,比如 create_timecreate_byupdate_timeupdate_by 等等。这些字段在保存或者新增的时候要手动添加进去这是很麻烦的。例如下面的方式

1
2
3
4
5
6
7
8
9
10
11
12
@Test
void testAutoFill() {
SysUser sysUser = new SysUser();
sysUser.setName("test");
sysUser.setAge(18);
sysUser.setEmail("runbrick@cc.com");

sysUser.setCreateBy("admin");
sysUser.setCreateTime(LocalDateTime.now());
sysUserMapper.insert(sysUser);
}

这样在写每个方法需要填充这个值的时候将是噩梦,这时候就凸显出有一个自动填充功能的好处了。实现自动填充的方法有很多这篇文章主要是使用 MyBatis Plus 来实现。毕竟比较方便有现成的轮子干嘛要自己费劲巴拉的再去创造轮子呢。

image

MyBatis Plus 自动填充的优点很多

  1. 简化字段填充:自动填充功能可以在插入或更新操作时自动填充指定的字段值,无需手动编写填充代码。例如,你可以使用自动填充功能在插入记录时自动填充创建时间,或在更新记录时自动填充更新时间。这样可以减少代码量,提高开发效率。
  2. 减少冗余代码:在传统的开发中,为了填充某些字段的值,通常需要在每个相关的方法中手动编写相应的代码。使用自动填充功能后,这些重复的代码可以集中在一个地方进行管理,减少了代码的冗余性,并且在需要修改填充逻辑时也更加方便。
  3. 维护数据一致性:通过自动填充功能,可以确保一些字段的值在每次操作时保持一致。例如,你可以使用自动填充功能在插入记录时自动填充创建人和更新人字段,保证这些字段的值始终正确且一致。
  4. 可扩展性:自动填充功能是可扩展的,你可以根据自己的需求进行定制和扩展。MyBatis-Plus提供了自定义的填充处理器(MetaObjectHandler),你可以实现自己的填充逻辑,并通过配置将其与自动填充功能集成。

综上所述,MyBatis-Plus 的自动填充功能可以简化开发过程,减少冗余代码,提高代码的可维护性和数据的一致性,同时还具有一定的可扩展性。

下面来写一个简单的示例程序,来体验一下自动填充带来的便利。首先先展示一下我本地的环境

  1. Windows 11 笔记本电脑一台
  2. jdk 1.8 的环境
  3. 一款趁手的 IDE
  4. SpringBoot 2.7.11 + mybatis-plus 3.5.3.1
  5. mysql 5.7
  6. lombok

创建一个测试表后面测试要用到

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `sys_user` (
`id` varchar(32) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`create_by` varchar(255) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`update_by` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

下面是代码结构

image

创建相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Data
@TableName(value = "sys_user")
public class SysUser {

@TableId(type = IdType.ASSIGN_UUID)
private String id;

private String name;

private Integer age;

private String email;


@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@TableField(fill = FieldFill.INSERT)
private String createBy;

@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;

@TableField(fill = FieldFill.UPDATE)
private String updateBy;
}

1
2
3
4
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
}

上面实体中 @TableField(fill = FieldFill.INSERT) 就是可以让字段自动填充的注解,其中 FieldFill.INSERT 是代表新建行的时候填充一些数据进去。扒了一下这个枚举类的代码可以使用下面几种类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入时填充字段
*/
INSERT,
/**
* 更新时填充字段
*/
UPDATE,
/**
* 插入和更新时填充字段
*/
INSERT_UPDATE
}


下面的类是上面注解能生效的关键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createBy", String.class, "admin");
}

@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateBy", String.class, "admin");
}
}

注意事项:

  • 填充原理是直接给entity的属性设置值!!!
  • 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null
  • MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充
  • 字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段
  • 填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component或@Bean注入
  • 要想根据注解FieldFill.xxx和字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法
  • 不需要根据任何来区分可以使用父类的fillStrategy方法
  • update(T t,Wrapper updateWrapper)时t不能为空,否则自动填充失效

搭建一个Hexo博客并用vercel部署

Hexo 是一款基于Node.js的静态博客生成器,具有简单易用、快速高效、丰富主题、插件支持等特点,适合用于个人博客、技术文档、个人网站等场景。而且基于 markdown 编写起来非常顺畅,个人非常喜欢这个博客。这次下定决心搭建一个 Hexo 博客来实现我日常分享的一个小博客网站。

前置准备

  1. 一台 windows 笔记本电脑,当然 mac 电脑也是没问题的,即使 Linux 电脑也是可以的。
  2. Git工具: Git (git-scm.com)
  3. Node+ Npm工具:Node.js (nodejs.org)
  4. 准备好 Hexo 博客程序: https://hexo.io/
  5. 创建一个 Git 仓库
  6. 注册一个 vercel 账号(如果有自己的服务器或者不适用 vercel 可以不用管这一步):https://vercel.com/
  7. 准备一个域名(如果不需要独立域名可以略过这一步)
  8. hexo 本地图片部署

正式开始

安装 Hexo 工具

上面的 GITNode在百度或者谷歌上已经有很多相关专业的教程,这里就不详细讲解这块的知识了。一般来说到官网上下载完毕直接下一步下一步即可。我们先来全局安装一个 Hexo 工具

1
npm install hexo-cli -g
创建 hexo 本地博客程序

安装完成之后我们就可以使用 hexo 的工具来创建博客了。在电脑上创建一个目录并进入该目录,我起名叫做 javier-blog,刚才我们安装过 Git 工具这时候就派上用场了。在该目录内右键找到 Git Bash Here 点击打开一个 Git的命令行窗口或者你可以使用其他的命令行工具。执行以下命令

1
2
3
4
5
hexo init 
# 下面是在执行上面的命令之后的结果
INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git
INFO Install dependencies
INFO Start blogging with Hexo!
启动 hexo 本地服务

安装完成 hexo程序直接执行 hexo s 命令就可以打开 hexo 的本地服务。在命令行上会显示启动后的服务地址。

1
2
3
INFO  Validating config
INFO Start processing
INFO Hexo is running at http://localhost:4000/ . Press Ctrl+C to stop.

image

以上就正式搭建完成 hexo 的博客程序了。

修改博客的基本信息

修改 博客的标题,副标题,描述,语言时区等信息

image

修改博客地址

image

创建 github 仓库

打开 https://github.com/ 创建一个仓库用来存储我们的部署程序,创建后是这个样子的。

image

image

同步本地 Hexo 部署页面到 github 中

初始化 git 项目

1
2
git init
git remote add origin https://github.com/runbrick/javier-blog.git

打开本地 **hexo **项目目录并执行下面的命令,用来安装 git 的部署组件

1
npm install hexo-deployer-git --save

安装之后在项目目录中找到 _config.yml 修改 deploy 参数

1
2
3
4
deploy:
type: 'git'
repo: 'https://github.com/runbrick/javier-blog.git'
branch: 'master'

执行 hexo g 然后执行 hexo d 将静态页面部署到 github 上,是这个样子的。

image

将项目部署到 vercel 上

如果不需要部署到 vercel 上此步可以略过

在 **dashboard **上 选择 Create a New Project

image

在关联的 **github **账户中,找到刚才的博客仓库,选择 import

image

进入部署页面选择 deploy

image

生成之后点击 Continue to Dashboard

image

点击 Visit 就可以看到刚刚生成的博客程序了

image

将项目资源文件放入同一个仓库中

在命令行创建一个新的分支并切换过去

1
git checkout -b source

提交代码

1
2
3
git add .
git commit -m "first commit"
git push origin source
常用命令
1
2
3
4
5
6
7
8
hexo new "name"       # 新建文章
hexo new page "name" # 新建页面
hexo g # 生成页面
hexo d # 部署
hexo g -d # 生成页面并部署
hexo s # 本地预览
hexo clean # 清除缓存和已生成的静态文件
hexo help # 帮助