【SpringBoot】——公共字段填充

news/2025/2/27 2:38:24/

🎼个人主页:【Y小夜】

😎作者简介:一位双非学校的大三学生,编程爱好者,

专注于基础和实战分享,欢迎私信咨询!

🎆入门专栏:🎇【MySQL,Java基础,Rust】

🎈热门专栏:🎊【Python,Javaweb,Springboot】 

感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️

目录

🎈主要解决的问题

🎈优点

🎈业务开发

🎉实现步骤

🎉实战案例


        在SpringBoot中,公共字段自动填充是为了解决在数据库操作中频繁设置一些通用字段(如创建时间、修改时间、创建人ID、修改人ID等)的问题。这些字段在多个表中都可能存在,且每次进行插入或更新操作时都需要a赋值,如果手动在每个业务方法中进行赋值操作,会导致代码冗余和繁琐。

🎈主要解决的问题

  1. 代码冗余:避免在每个业务方法中重复编写赋值逻辑,减少代码量。

  2. 维护困难:当公共字段的赋值逻辑需要变更时,只需修改一处即可,无需逐个修改业务方法。

  3. 提高开发效率:开发人员可以专注于业务逻辑的实现,而无需关心公共字段的赋值细节。

  4. 减少错误:自动填充可以减少因人为疏忽而导致的赋值错误。

🎈优点

  1. 简化代码结构:通过AOP(面向切面编程)和自定义注解等方式,将公共字段的赋值逻辑从业务方法中分离出来,使代码更加清晰和简洁。

  2. 提高可读性:业务方法不再包含与业务逻辑无关的赋值代码,更容易被理解和维护。

  3. 增强灵活性:可以根据不同的需求灵活地配置公共字段的赋值策略,如仅在插入时赋值、在插入和更新时都赋值等。

  4. 提升性能:虽然自动填充本身不会直接提升性能,但它可以减少开发人员在赋值逻辑上的思考和编码时间,从而间接提高开发效率。

🎈业务开发

提醒:本次是使用的基于mp的框架

🎉实现步骤

第一步:在实体类的属性上加入@TableField注解,指定自动填充的策略

第二步:按框架要求编写店数据对象处理器,在次类中统一为公共字段赋值,此类需要是实现MetaObjectHandle接口

🎉实战案例

这里以瑞吉外卖举例子

Employee:

java">package org.example.reggie.entity;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;@Data
public class Employee implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String username;private String name;private String password;private String phone;private String sex;private String idNumber;private Integer status;@TableField(fill = FieldFill.INSERT)//插入时填充字段private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;@TableField(fill = FieldFill.INSERT)private Long createUser;@TableField(fill = FieldFill.INSERT_UPDATE)private Long updateUser;}

实现 MetaObjectHandler:

java">package org.example.reggie.common;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;/*** 元数据处理器,用于填充公共字段*/
@Component
public class MyMetaObjecthandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {metaObject.setValue("createTime", LocalDateTime.now());metaObject.setValue("updateTime", LocalDateTime.now());metaObject.setValue("createUser", BaseContext.getCurrentId());metaObject.setValue("updateUser", BaseContext.getCurrentId());}@Overridepublic void updateFill(MetaObject metaObject) {metaObject.setValue("updateTime", LocalDateTime.now());metaObject.setValue("updateUser", BaseContext.getCurrentId());}
}

提醒:这里BaseContext类是用了thread local实现的一个类,主要方法如下

BaseContext类

java">package org.example.reggie.common;/*** 机遇ThreadLocal封装工具类,用户保存和获取当前登入的用户id*/
public class BaseContext {private static final  ThreadLocal<Long> threadLocal = new ThreadLocal<>();/*** 将id存入threadlocal* @param id*/public static void setCurrentId(Long id){threadLocal.set(id);}/*** 取出threadlocal中的id* @return*/public static Long getCurrentId(){return threadLocal.get();}
}

用户登录后,将userid存入threadlocal中,当需要时,利用静态方法取出 


http://www.ppmy.cn/news/1575148.html

相关文章

【Gin-Web】Bluebell社区项目梳理4:帖子相关接口开发及实现

本文目录 一、创建帖子RoutersControllerLogic/serviceDao 二、查询帖子接口三、分页查询展示 一、创建帖子 Routers 创建帖子的接口需要经过JWT认证才能访问&#xff0c;相关JWT内容在昨天的博客中已经回顾过了。接下来继续往下看。 Controller Controller层的代码如下&…

基本网络安全的实现

基本网络安全的实现 一 &#xff1a;AAA AAA 是Authentication&#xff0c;Authorization and Accounting&#xff08;认证、授权和计费&#xff09;的简 称&#xff0c;它提供了一个用来对认证、授权和计费这三种安全功能进行配置的一致性框架&#xff0c; 它是对网络安全…

用Golang与WebAssembly构建高性能Web应用:详解`syscall/js`包

用Golang与WebAssembly构建高性能Web应用&#xff1a;详解syscall/js包 引言为什么选择syscall/js包&#xff1f;适用场景 syscall/js包概述syscall/js包的核心概念1. js.Global2. js.Value3. js.Func4. js.Null 和 js.Undefined syscall/js包在WebAssembly中的位置 环境配置与…

【QT Quick】C++扩展QML类型

本教程将教你如何在 Qt Quick 项目中使用 C 扩展 QML 类型&#xff0c;具体包括定义可被 QML 调用的类、配置支持混合开发的 CMake 项目&#xff0c;并演示如何在 QML 中使用这些类型&#xff0c;以一个包含 DemoController 类的示例项目为基础逐步讲解。 项目结构概览 在开始…

利用机器学习实现实时交易欺诈检测

以下是一个基于Python的银行反欺诈AI应用示例代码,演示如何利用机器学习实现实时交易欺诈检测。该示例使用LightGBM算法训练模型,并通过Flask框架构建实时检测API: python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preproc…

stm32仿真 74hc238流水灯 数码管动态数字显示

f103c6t6a_hex文件 #include "main.h"![请添加图片描述](https://i-blog.csdnimg.cn/direct/8c0d44b121134cf08f5186df316ea07f.gif)#include "stdlib.h"void SystemClock_Config(void); static void MX_GPIO_Init(void); // 自定义abc引脚 #define A_PIN…

MQ(Message Queue)

目录 MQ(Message Queue)基本概念 为什么要使用消息队列&#xff1f; 使用消息队列有什么缺点&#xff1f; 如何保证消息不丢失?(如何保证消息的可靠性传输?/如何处理消息丢失的问题?) 通用的MQ场景&#xff1a; RabbitMQ如何保证消息不丢失&#xff1f; 生产者丢数据…

PHP课程预约小程序源码

&#x1f4f1; 课程预约小程序&#xff1a;为您专属定制的便捷预约新体验 在这个快节奏的时代&#xff0c;我们深知每一位瑜伽爱好者、普拉提追随者以及培训机构管理者对高效、便捷服务的迫切需求。因此&#xff0c;我们匠心独运&#xff0c;推出了一款基于PHPUniApp框架开发的…