系列博客专栏: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. JPA自动生成POJO

    原文地址 JPA自动生成POJO 通过表生成POJO类 这篇文章不涉及idea配置数据源教程,该文章使用前提是用户已配置好idea数据源 修改自带的生成类 import com.intellij.da ...

  2. Word转换HTML(Java实用版)

    前言: 在业务中,如果需要在浏览器中预览Word文档,或者需要将Word文档转成HTML文件保存,那么本章内容,可以帮助到你. 实现这一功能,有多种实现方式,如:docx4j.poi.Free Spi ...

  3. 手动安装vur-router并引用

    安装并引用 安装 npm install vue-router 引用 步骤一:在src路径下,创建router文件夹, 其下创建index.js // router/index.js import V ...

  4. UE源码分析:Slate 类鼠标输入处理

    序言 UE4.25版本 本章看一下UE的 "类鼠标"输入处理(其实就是鼠标和触摸的输入,我也没找到专门的术语来代指,英文UE用的是PointerXXX),主要是按下.移动.抬起等相 ...

  5. Health Kit基于数据提供专业方案,改善用户睡眠质量

    什么是CBT-I? 中国社科院等机构今年发布的<中国睡眠研究报告2023>内容显示,2022年,受访者的每晚平均睡眠时长为7.40小时,近半数受访者的每晚平均睡眠时长不足8小时(47.55 ...

  6. 学好Elasticsearch系列-索引的批量操作

    本文已收录至 Github,推荐阅读 Java 随想录 微信公众号:Java 随想录 先看后赞,养成习惯. 点赞收藏,人生辉煌. 目录 基于 mget 的批量查询 基于 bulk 的批量增删改 增加 ...

  7. 基于bert-base-chinese训练bert模型(最后附上整体代码)

    目录: 一.bert-base-chinese模型下载 二.数据集的介绍 三.完成类的代码 四.写训练方法 五.总源码及源码参考出处 一.bert-base-chinese模型下载 对于已经预训练好的 ...

  8. 虾皮shopee根据ID取商品详情 API 返回值说明

    ​ item_get-根据ID取商品详情  注册开通 shopee.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secr ...

  9. 基于 LLM 的知识图谱另类实践

    本文整理自社区用户陈卓见在「夜谈 LLM」主题分享上的演讲,主要包括以下内容: 利用大模型构建知识图谱 利用大模型操作结构化数据 利用大模型使用工具 利用大模型构建知识图谱 上图是之前,我基于大语言模 ...

  10. torch-1 tensor & optim

    开个新坑, pytorch源码阅读-从python代码开始读起. torch/ 1.tensor.py 继承自torch._C._TensorBase , 包括各种操作,TODO:随后看cpp代码 _ ...