系列博客专栏: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. 2023-07-20:假设一共有M个车库,编号1~M,时间点从早到晚是从1~T, 一共有N个记录,每一条记录如下{a, b, c}, 表示一辆车在b时间点进入a车库,在c时间点从a车库出去, 一共有K

    2023-07-20:假设一共有M个车库,编号1 ~ M,时间点从早到晚是从1 ~ T, 一共有N个记录,每一条记录如下{a, b, c}, 表示一辆车在b时间点进入a车库,在c时间点从a车库出去, ...

  2. 前后端分离实现注册+登录(Vue3.0 + Django3.2)

    博客地址:https://www.cnblogs.com/zylyehuo/ 一.使用 vite+webstorm 搭建 Vue 环境,构建前端 1.结构树 2.main.js import { cr ...

  3. Mysql基础8-多表查询

    一.多表关系 一对多或者多对一 案例:部门与员工的关系 关系:一个部门对应多个员工,一个员工对应一个部门(不考虑跨部门的特殊情况) 实现:在多的一方建立外键,指向一的一方的主键,这里员工表是多的的一方 ...

  4. spring-mvc系列:简介和基本使用

    目录 一.简介 1.什么是MVC 2.什么是SpringMVC 3.SpringMVC的特点 二.基本使用 1.开发环境 2.创建maven工程 3.配置web.xml 4.创建SpringMVC的配 ...

  5. 使用文件批量find

    有时候需要找一批文件传到本地,文件名都不一样.可以先把文件名写到文件里面,一个文件名为一行. 比如: file1.wav file2.wav file3.wav 在命令行执行: for i in `c ...

  6. PB从入坑到放弃(六)动态SQL应用

    写在前面 动态 SQL 语句是部分或者整个 SQL 语句在运行时才能确定,可以更好的与用户进行交互,大大提高了SQL的灵活性 一.执行SQL语句 1.1 执行无入参SQL ① 语法 EXECUTE I ...

  7. 【Unity3D】高斯模糊特效

    1 高斯模糊原理 ​ 边缘检测特效中使用了卷积运算进行了边缘检测,本文实现的高斯模糊特效同样使用了卷积运算,关于卷积核和卷积运算的概念,读者可以参考边缘检测特效. ​ 本文完整资源见→Unity3D高 ...

  8. 2.go语言基础类型漫游

    本篇前瞻 本篇是go语言的基础篇,主要是帮助大家梳理一下go语言的基本类型,注意本篇有参考go圣经,如果你有完整学习的需求可以看一下,另外,go语言的基本类型比较简单,介绍过程就比较粗暴. 基本类型 ...

  9. Callback Function Essence

    Include Example Input: I am a. route execute finish. I am b. route execute finish. What is Callback ...

  10. 如何调用API接口获取商品数据

    在当今数字化的时代,电子商务的崛起使得网购成为了人们生活中不可或缺的一部分.作为电子商务中最为熟知和流行的平台之一,拥有大量的商品资源和用户群体.如果你是一名开发者或者是对数据分析感兴趣的人,你可能会 ...