mybatis 自动填充字段 MybatisMetaObjectHandler

业务场景: 当一个实体有被N个接口跟新或添加.
此时有需求, 当更新或新增该实体对象时, 需要执行一段业务逻辑

解决方案1 : 找到所有操作该实体的接口, 在所有接口中调用该逻辑. 此方案费力且容易漏掉接口
解决方案2 : 使用 MybatisMetaObjectHandler

一下是项目实例

sql

CREATE TABLE `product` (`id` int NOT NULL AUTO_INCREMENT,`name_zh` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,`name_zh_pinyin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci```

POM

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.17.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- Hutool Core --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.13</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version><scope>runtime</scope></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-math3</artifactId><version>3.6.1</version> <!-- 请检查是否有更新的版本 --></dependency></dependencies>

实体类

package com.example.demo.handle;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;@Data
public class Product {@TableId(value = "id", type = IdType.AUTO)Integer id;@TableField(value = "name_zh")String nameZh;@TableField(value = "name_zh_pinyin",fill = FieldFill.INSERT_UPDATE)String nameZhPinyin;
}

mapper

package com.example.demo.handle;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface ProductMapper extends BaseMapper<Product> {}

MybatisMetaObjectHandler

package com.example.demo.handle;import cn.hutool.extra.pinyin.PinyinUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class MybatisMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {if (metaObject.getValue("nameZh") == null) {return;}String pingYin = metaObject.getValue("nameZh").toString();pingYin = PinyinUtil.getPinyin(pingYin);//  新增自动执行                  实体类字段名称this.setFieldValByName("nameZhPinyin", pingYin, metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {if (metaObject.getValue("nameZh") == null) {return;}// 更新自动执行String pingYin = metaObject.getValue("nameZh").toString();pingYin = PinyinUtil.getPinyin(pingYin);this.setFieldValByName("nameZhPinyin", PinyinUtil.getPinyin(pingYin), metaObject);}}

测试类

package com.example.demo;import com.example.demo.handle.Product;
import com.example.demo.handle.ProductMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class DemoApplicationTests {@AutowiredProductMapper productMapper;@Testvoid contextLoads() {System.out.println("-------------------自动添加拼音----------------------");Product product2 = new Product();product2.setNameZh("李四");productMapper.insert(product2);productMapper.selectList(null).forEach(System.out::println);}}

输出结果

-------------------自动添加拼音----------------------
2024-10-09 16:44:37.878  INFO 40880 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2024-10-09 16:44:38.445  INFO 40880 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
Product(id=10, nameZh=李四, nameZhPinyin=li si)

结论

可以看出, 新增数据时并未添 set nameZhPinyin 字段
但是从查询结果可以看出, 的确 nameZhPinyin 被更新到数据表中

从上面的案例中也许并未提现该接口的作用, 当有 100个更新时,就避免了很多重复性的操作

MetaObjectHandler 是 MyBatis-Plus 提供的一个接口,用于在插入或更新数据时自动填充某些字段,比如创建时间、更新时间、创建人、更新人等。通过实现这个接口,你可以自定义这些字段的填充逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558749.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes----基础命令合集

目录 一、命令概述 1.1命令分类 1.2 基本语法 二、查看基本信息 2.1 环境指令 2.1.1 查看版本信息 2.1.2 查看资源对象简写 2.1.3 添加补全信息 2.1.4 查看日志 2.1.5 查看集群信息 2.2 查看资源信息 2.2.1 获取资源相关信息 ① 查看集群组件状态 ② 查看命名空间…

Linux入门3——vim的简单使用

1.vim 1.1 vim的模式 vim有三种主要模式&#xff1a; ①命令模式&#xff1a;使用vim刚打开进入的模式就是命令模式&#xff1b; ②插入模式&#xff1a;只有在插入模式下才可以做文字输入&#xff0c;按[Esc]键可退回命令模式&#xff1b; ③末行模式&#xff1a;文件保存或退…

【Java】并发革命:线程池

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在当今软件开发领域&#xff0c;多线程编程已成为提升应用性能的核心技术。随着业务需求的增长&#xff0c;线程的频繁创建和销毁不仅增加了系统的开销&#xff0c;也影响了程序的运行效率。 尽管线…

鸿蒙开发(NEXT/API 12)【蓝牙服务开发】网络篇

概述 蓝牙技术是一种无线通信技术&#xff0c;可以在短距离内传输数据。它是由爱立信公司于1994年提出的&#xff0c;使用2.4 GHz的ISM频段&#xff0c;可以在10米左右的距离内进行通信。可以用于连接手机、耳机、音箱、键盘、鼠标、打印机等各种设备。特点是低功耗、低成本、…

面试笔记-js基础篇

1、因为在 JS 的最初版本中&#xff0c;使用的是 32 位系统&#xff0c;为了性能考虑使用低位存储了变量的类型信息&#xff0c;000 开头代表是对象&#xff0c;然而 null 表示为全零&#xff0c;所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了&#xff…

胤娲科技:AI评估新纪元——LightEval引领透明化与定制化浪潮

AI评估的迷雾&#xff0c;LightEval能否拨云见日&#xff1f; 想象一下&#xff0c;你是一位AI模型的开发者&#xff0c;精心打造了一个智能助手&#xff0c;却在最终评估阶段遭遇了意外的“滑铁卢”。 问题出在哪里&#xff1f;是模型本身不够聪明&#xff0c;还是评估标准太过…

迷你洗衣机实不实用?五款精良内衣洗衣机专业实测!

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

数据分析-30-7万条天猫订单数据分析

文章目录 项目说明Part 11、数据说明及分析目录2、数据理解与处理3、数据分析可视化3.1 整体情况3.2 地区分析3.3 时间分析 Part 21、数据说明及分析目录2、数据理解及处理3、数据分析与可视化3.1 每日整体销售量走势3.2 谁家的化妆品卖的最好3.3 谁家的化妆品最贵 Part31、数据…

2024年还不知道如何清理c盘?最齐全的C盘清理指南!(非常详细)零基础入门到精通,收藏这一篇就够了

这段时间以来&#xff0c;我收到最多的问题还是问如何解决C盘爆满&#xff0c;那么今天就来给大家详细讲述一下该怎么给C盘“瘦身”。 我之前在文章《带你全面了解你的C盘&#xff01;并且给它“瘦身”&#xff01;》中讲到过C盘各个文件夹的作用&#xff0c;也提到过一些清理…

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python毕业设计 Python毕业设计选题 Spark 大数据【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

车牌检测系统源码分享

车牌检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision 研究…

骨传导耳机哪个牌子好?五大选购妙计带你精准入手优质骨传导耳机!

随着骨传导耳机市场的蓬勃发展&#xff0c;此产品凭借优秀的佩戴体验以及可降低听力损伤等优点引起了广泛的关注。然而&#xff0c;随着热度提高&#xff0c;市面上开始出现了许多品牌&#xff0c;这些品牌实力技术各不相同&#xff0c;甚至其中还有一些劣质机型&#xff0c;这…

imageJ 将多图中的同一条划线数据用曲线展示

1、导入图片&#xff0c;将所需的图片放进同一个文件夹&#xff0c;按顺序命名 2、划线 3、导出数据及画曲线 1&#xff09;得到单图的曲线上的图像数据&#xff1a;选中图片 -----> ctrl k 2&#xff09;将多张图像的同一条曲线位置的图像数据在同一数轴上画出曲线 步骤…

ChatGPT可以分析股票吗?

结合国庆前大A股市的小波牛市以及今天的股市表现&#xff0c;我从多个角度为你提供一些分析和建议&#xff1a; 一、国庆前的小波牛市分析 国庆前&#xff0c;大A股市出现了一波小幅上涨&#xff0c;市场呈现出一些积极的信号&#xff1a; 政策面利好&#xff1a;政府出台了…

张博,在压力下保持松弛的研一字节“老员工”|MarsCoders 开发者说

「MarsCoders 开发者说」是 AI 时代下各类技术栈、各种经历的开发者的故事记录&#xff0c;我们捕捉并再现他们在技术洪流中的职场蜕变与角色定位重塑&#xff0c;希望给更多开发者带来启发。 同时&#xff0c;该系列也记录了众多豆包MarsCode 用户和 AI 爱好者们的实践案例&am…

SQLite Developer使用说明

1.SQLite Developer下载 SQLite Developer官方版是SharpPlus出品的一款数据库管理工具。支持对sqlite3数据库的管理&#xff0c;能够自动完成窗口显示和执行数据库命令等多种特色。并且支持打开.db文件&#xff0c;适用于Android的开发。另外&#xff0c;使用Sqlite Developer…

如何防止源代码泄密?十种有效方法防止源代码泄密

关于深圳德信仁合信息有限公司的天锐绿盾产品&#xff0c;该产品专注于企业数据防泄漏&#xff0c;特别是源代码等核心技术资料的保护。以下是根据您提到的需求&#xff0c;即如何防止源代码泄密的十种有效方法&#xff0c;基于天锐绿盾产品的特点进行的归纳&#xff1a; 一、动…

windows11下面使用Pyinstaller打包python程序

文章目录 一、安装Python二、安装pip三、通过pip安装pyinstaller四、使用pyinstaller打包python为二进制程序参考 一、安装Python 我这里直接下载的是Python的可执行程序包&#xff0c;打开即用的版本&#xff0c; 也可以按照以下的教程安装python工具到windows上面 &#…

视频汇聚平台EasyCVR支持云端录像丨监控存储丨录像回看丨录像计划丨录像配置

EasyCVR视频汇聚融合平台&#xff0c;是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。平台以其强大的视频处理、汇聚与融合能力&#xff0c;在构建视频监控系统中展现出了独特的优势。 EasyCVR视频汇聚平台可接入传统监控行业中高清网络摄像机的RTSP…

AI 写作工具大比拼:揭秘 Claude 的神秘魅力以及如何订阅 Claude

AI 写作困境与 Claude 的惊喜表现 最近有很多朋友在吐槽 AI 写的文章不太行&#xff0c;我一看他的要求写的很清楚&#xff0c;已经把提示词都用到位了&#xff0c;例如&#xff1a;写作背景、写作要求等&#xff0c;都有具体写出来。但文章阅读起来就是欠缺点啥。 你们有没有…