系列博客专栏:SpringBoot2.0系列博客专栏

开发环境

  • JDK 1.8

  • SpringBoot2.2.1

  • Maven 3.2+

  • Mysql5.7.36

  • 开发工具

    • IntelliJ IDEA

    • smartGit

项目场景

在项目中经常会遇到需要自动填充数据的情况,比如新增一个DO类,里面可能会有idcreate_timemodify_timecreate_user等等这些通用的字段,每一个接口我们都要去设置值,不仅代码冗余,而且不能统一管理


解决方案:

针对这种情况,可以使用Mybatis Plus来对通用数据的自动填充,在我之前的博客中,已经对怎么在Springboot2.0中集成Mybatis Plus做了比较详细的描述,下面给一个例子,看看自动填充的实现

创建数据库表

CREATE TABLE `user` (
`id` bigint NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`modify_time` datetime DEFAULT NULL,
`is_deleted` int DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

通用的BO类,里面有idcreateTimemodifyTimeis_deleted等等,对于主键ID有如下的主键策略

  • ASSIGN_ID(雪花算法)

  • ASSIGN_UUID(排除中划线的UUID)

  • AUTO(数据库ID自增)

  • INPUT(插入前自行设置主键值)

  • NONE(无状态)

package com.example.mybatisplus.model;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data; import java.time.LocalDateTime; @Data
public class BaseDO { @TableId(type = IdType.ASSIGN_ID)
private Long id; @TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime modifyTime; @TableLogic(value = "0", delval = "1")
@TableField(value = "is_deleted", select = false)
private Boolean deleted; }

用户信息的DO类继承BaseDO

package com.example.mybatisplus.model;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode; import java.io.Serializable; @TableName("user")
@EqualsAndHashCode(callSuper=true)
@Data
public class UserDO extends BaseDO implements Serializable { private static final long serialVersionUID = -2767372720145830784L; private String name;
private Integer age;
private String email; }

在application.yml配置mybatis plus

mybatis-plus:
type-aliases-package: com.example.mybatisplus.*.*.model
mapper-locations: classpath*:mapper/*/*.xml
global-config:
db-config:
logic-not-delete-value: 1
logic-delete-value: 0
configuration:
map-underscore-to-camel-case: true
default-statement-timeout: 60
cache-enabled: true
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

对于创建日期等字段的自动填充,我们写一个handler类,实现MetaObjectHandler接口,注意加上@Component,才能被Spring容器管理

package com.example.mybatisplus.common.handlers;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Component
@Slf4j
public class FillMetaObjectHandler implements MetaObjectHandler { @Override
public void insertFill(MetaObject metaObject) {
log.info("insertFill");
this.setFieldValByName("createTime" , LocalDateTime.now(), metaObject);
this.setFieldValByName("modifyTime" , LocalDateTime.now() , metaObject);
} @Override
public void updateFill(MetaObject metaObject) {
log.info("updateFill");
this.setFieldValByName("modifyTime" , LocalDateTime.now(), metaObject);
}
}

Mapper接口

package com.example.mybatisplus.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus.common.cache.MyBatisRedisCache;
import com.example.mybatisplus.model.UserDO;
import org.apache.ibatis.annotations.CacheNamespace; @DS(value = "testDB")
@CacheNamespace(implementation = MyBatisRedisCache.class ,eviction = MyBatisRedisCache.class)
public interface UserMapper extends BaseMapper<UserDO>{ }

业务接口api

package com.example.mybatisplus.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.mybatisplus.model.UserDO; public interface IUserService extends IService<UserDO> { }

业务实现类

package com.example.mybatisplus.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mybatisplus.mapper.UserMapper;
import com.example.mybatisplus.model.UserDO;
import com.example.mybatisplus.service.IUserService;
import org.springframework.stereotype.Service; @Service
public class UserServiceImpl extends ServiceImpl<UserMapper , UserDO> implements IUserService { }

新增用户的api接口

  @PostMapping(value = "/user")
public ResultBean<UserDO> save(@RequestBody UserDto userDto) {
UserDO user = BeanUtil.copyProperties(userDto , UserDO.class);
boolean flag = userService.save(user);
if (flag) return ResultBean.ok(user);
return ResultBean.badRequest("新增失败");
}

SpringBoot系列之MyBatis Plus自动填充实现的更多相关文章

  1. SpringBoot系列-整合Mybatis(注解方式)

    目录 一.常用注解说明 二.实战 三.测试 四.注意事项 上一篇文章<SpringBoot系列-整合Mybatis(XML配置方式)>介绍了XML配置方式整合的过程,本文介绍下Spring ...

  2. SpringBoot系列: 使用MyBatis maven插件自动生成java代码

    ====================================pom.xml 文件====================================需要在 pom.xml 文件增加 m ...

  3. SpringBoot系列: 集成MyBatis

    本文主要修改自下面博客:http://www.ityouknow.com/springboot/2016/11/06/spring-boo-mybatis.htmlhttp://tengj.top/2 ...

  4. SpringBoot系列-整合Mybatis(XML配置方式)

    目录 一.什么是 MyBatis? 二.整合方式 三.实战 四.测试 本文介绍下SpringBoot整合Mybatis(XML配置方式)的过程. 一.什么是 MyBatis? MyBatis 是一款优 ...

  5. (二十二)SpringBoot之使用mybatis generator自动生成bean、mapper、mapper xml

    一.下载mybatis generator插件 二.生成generatorConfig.xml new一个generatorConfig.xml 三.修改generatorConfig.xml 里面的 ...

  6. 如何自动填充SQL语句中的公共字段

    1. 前言 我们在设计数据库的时候一定会带上新增.更新的时间.操作者等审计信息. 之所以带这些信息是因为假如有一天公司的数据库被人为删了,尽管可能有数据库备份可以恢复数据.但是我们仍然需要追踪到这个事 ...

  7. Springboot 系列(十一)使用 Mybatis(自动生成插件) 访问数据库

    1. Springboot mybatis 介绍 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数获取 ...

  8. Springboot 系列(十二)使用 Mybatis 集成 pagehelper 分页插件和 mapper 插件

    前言 在 Springboot 系列文章第十一篇里(使用 Mybatis(自动生成插件) 访问数据库),实验了 Springboot 结合 Mybatis 以及 Mybatis-generator 生 ...

  9. SpringBoot系列之集成Mybatis教程

    SpringBoot系列之集成Mybatis教程 环境准备:IDEA + maven 本博客通过例子的方式,介绍Springboot集成Mybatis的两种方法,一种是通过注解实现,一种是通过xml的 ...

  10. SpringBoot系列(五)Mybatis整合完整详细版

    SpringBoot系列(五)Mybatis整合 目录 mybatis简介 项目创建 entity dao service serviceImpl mapper controller 1. Mybat ...

随机推荐

  1. Redis的设计与实现(6)-压缩列表

    压缩列表 (ziplist) 是列表键和哈希键的底层实现之一. 当一个列表键只包含少量列表项, 并且每个列表项要么就是小整数值, 要么就是长度比较短的字符串, 那么 Redis 就会使用压缩列表来做列 ...

  2. JVM虚拟机栈

    JVM虚拟机栈 1.概述 1.1背景 由于跨平台性的设计,Java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降 ...

  3. asp.net core之Host

    Host简介 在ASP.NET Core中,Host是一个托管应用程序的宿主环境.它提供了一种统一的方式来启动和运行应用程序,无论是在开发环境中还是在生产环境中.Host负责处理应用程序的生命周期.配 ...

  4. 2021-7-7 Vue的for使用实例

    <!DOCTYPE html> <html> <head> <title> </title> </head> <body& ...

  5. python: 判断是否是某一类型

    函数isinstance 语法 isinstance(object, classinfo) 参数 object -- 实例对象. classinfo -- 可以是直接或间接类名.基本类型或者由它们组成 ...

  6. 【技术积累】Linux中的命令行【理论篇】【三】

    apt-get命令 命令介绍 Debian Linux发行版中的APT软件包管理工具,apt-get命令 是Debian Linux发行版中的APT软件包管理工具.所有基于Debian的发行都使用这个 ...

  7. [django]数据的导入和导出

    除了使用mysqldump或者MySQL客户端进行数据导出,django也提供了类似的功能. 导出 # 导出整个数据库并保存为json文件 python manage.py dumpdata > ...

  8. 程序后台运行方法:使用守护进程 或 screen软件

    我们常需要SSH远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,在此期间不能关掉窗口或者断开连接,否则这个任务会被杀掉,一切就半途而废了. 可以使用以下两个方法: 方法一:noh ...

  9. 如何利用AI智能聊天机器人10秒钟做出一个故事绘本的神奇插件

    原文链接:如何利用AI智能聊天机器人10秒钟做出一个故事绘本的神奇插件 ChatGPT以下称为AI智能聊天机器人 一.AI智能聊天机器人4中集成"Stories"插件 对于已经熟悉 ...

  10. RocketMQ系列(一) 基本介绍

    RocketMQ系列(一) 基本介绍 1.MQ 作用 MQ 的应用场景主要包含以下 3 个方面: 1.1.异步与解耦 当我们下了一个订单之后,订单服务会进行 RPC 同步调用 支付服务.库存服务.物流 ...