mybatis-plus默认字段填充以及批量数据插入优化

日常开发中,我们需要设置一些数据库的默认字段填充,比如创建时间、创建人、更新时间、更新人等等,那么mybatis-plus给我们提供了一个这样的接口去做这件事情

MetaObjectHandler。

1、首先可以创建一个实现类来实现MetaObjectHandler接口

@Configuration
public class FillObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill ....");this.setFieldValByName("createTime", DateUtils.getNowDate(), metaObject);this.setFieldValByName("createBy", SecurityContextHolder.getUserName(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill ....");this.setFieldValByName("updateTime", DateUtils.getNowDate(), metaObject);this.setFieldValByName("updateBy", SecurityContextHolder.getUserName(), metaObject);}
}

这里重写的两个方法,一个是再插入时调用,一个是更新时调用。

这里设置创建人的时候,有的时候,你是再子线程中进行获取上下文中用户名,但是子线程并不能获取到主线程的数据,那么这个时候,需要使用到ThreadLocal,将主线程的变量保存在ThreadLocal中,然后通过SecurityContextHolder来获取。

2、

public class SecurityContextHolder {private static final TransmittableThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<>();public static void set(String key, Object value) {Map<String, Object> map = getLocalMap();map.put(key, value == null ? StringUtils.EMPTY : value);}public static String get(String key) {Map<String, Object> map = getLocalMap();return Convert.toStr(map.getOrDefault(key, StringUtils.EMPTY));}public static <T> T get(String key, Class<T> clazz) {Map<String, Object> map = getLocalMap();return StringUtils.cast(map.getOrDefault(key, null));}public static Map<String, Object> getLocalMap() {Map<String, Object> map = THREAD_LOCAL.get();if (map == null) {map = new ConcurrentHashMap<String, Object>();THREAD_LOCAL.set(map);}return map;}public static void setLocalMap(Map<String, Object> threadLocalMap) {THREAD_LOCAL.set(threadLocalMap);}public static String getUserName() {return get("username");}public static void setUserName(String username) {set("username", username);}public static void remove() {THREAD_LOCAL.remove();}
}

3、需要一个拦截器,在接受到请求时,将变量写入到Threadlocal中

@Component
public class SecurityInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//通过request获取到当前访问用户信息 在设置进线程变量中SecurityContextHolder.setUserName(SecurityUtils.getUsername());return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {SecurityContextHolder.remove();}
}

做完以上步骤后,就可以完成默认字段设置了。

mybtais-plus是提供了批量插入的方法的,只需要继承ServiceImpl类就可以使用,但是貌似插入时也是单条进行插入。

他这块是批量提交到数据库,然后单条插入。

我们可以使用mybatis的sql注入器,mybatis-plus其实已经提供了这个方法

insertBatchSomeColumn

1、首先第一步需要自定义一个sql注入器

public class BatchSqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {List<AbstractMethod> methodList = super.getMethodList(mapperClass,tableInfo);//更新时自动填充的字段,不用插入值methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));return methodList;}}

2、创建mybatis-plus的配置类

@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//分页interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//乐观锁interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}@Beanpublic BatchSqlInjector sqlInjector() {return new BatchSqlInjector();}}

3、insertBatchSomeColumn方法名称需要保持一致

public interface BatchInsertMapper<T> extends BaseMapper<T> {int insertBatchSomeColumn(List<T> entityList);}

4、然后使用我们的mapper调用insertBatchSomeColumn就可以使用一条sql语句去执行批量插入了。如果不是大批量数据需要插入,也没有时限要求,也用不上这个方法,适用于对大批量插入有性能要求的可以使用

5、另外一个可以在数据库连接池上进行调整。设置参数

rewriteBatchedStatements=true有很大批量插入性能提升

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

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

相关文章

DBMotion x Chat2DB:高效迁移,优雅同步,数据腾飞不再愁

DBMotion 基本介绍 数据传输服务DBMotion是一款轻量、绿色的数据库迁移、同步、校验工具。支持国产化数据迁移、支持容灾演练、支持两地三中心和异地多活&#xff1b;源库无感知、简单易集成、丝滑高性能。助您在多云之间随心迁移、自由容灾。 功能介绍 已支持的数据库 v1.…

7月22日JavaSE学习笔记

Collection接口&#xff0c;还有一个父级接口Iterable可迭代的 Collection继承树 Set 集合 Set的底层是用Map实现&#xff08;存储在key中&#xff0c;value中是空的Object对象&#xff09; 有序&#xff1a;取出的顺序和添加的顺序是一样的。 List是有序的&#xff0c;Set是…

“软件质量”,构筑企业值得信赖的护城河

引子 质量是产品的生命线&#xff0c;质量问题不仅会导致企业财产损失&#xff0c;还可能引发业务中断、客户满意度下降、企业品牌声誉受损等负面影响。如何在软件开发过程中全方位构建产品质量防护盾&#xff0c;是各行业保障产品高质量的重要课题。 如何保障软件质量&#…

五、SpringIoC/DI的使用

1. 类注解、方法注解 告诉spring管理bean—>bean的存储 1、类注解&#xff1a;五大注解 Controller&#xff08;控制器存储&#xff09;、 Service&#xff08;服务存储&#xff09;、 Repository&#xff08;仓库存储&#xff09;、 Component&#xff08;组件存储&#xf…

【Linux】管道通信和 system V 通信

文章目录 一、进程通信原理&#xff08;让不同进程看到同一份资源&#xff09;二、管道通信2.1 管道原理及其特点2.1 匿名管道和命名管道 三、共享内存通信3.1 共享内存原理3.2 创建和关联共享内存3.3 去关联、ipc 指令和删除共享内存 四、消息队列和信号量&#xff08;了解&am…

VirtualSurveyor9.0.3 无人机测绘软件功能介绍

Virtual Surveyor9.0.3中文版是功能强大的无人机测绘软件&#xff0c;使用旨在为用户提供完整的地理空间数据可视化和分析功能&#xff0c;带来提高的生产力&#xff0c;功能全面而强大&#xff0c;在无人机到CAD模型的过程中&#xff0c;使用Virtual Surveyor软件来拆卸输送机…

情绪稳定的人有什么特点?

第一部分&#xff1a;至纯之人&#xff0c;大器晚成 1.1 单纯&#xff0c;不是天真 你知道吗&#xff1f;那些能够成就大事的人&#xff0c;往往在人性上非常单纯。他们对外界的需求很低&#xff0c;更多的是向内寻求。这样的人&#xff0c;他们的内心世界像一片净土&#xff…

数据结构与算法--顺序表(Java)

&#x1f4dd;个人主页&#x1f339;&#xff1a;誓则盟约 ⏩收录专栏⏪&#xff1a;Java SE &#x1f921;往期回顾&#x1f921;&#xff1a;Java SE--基本数据类型&#xff08;详细讲解&#xff09; &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 什么…

每日任务:TCP/IP模型和OSI模型的区别

介绍一下TCP/IP模型和OSI模型的区别&#xff1f; OSI模型由国标准化组织提出&#xff0c;而TCP/IP模型是由美国国防部开发的&#xff1b; OSI模型由七个层次组成&#xff0c;从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP模型只有四层…

AI视频生成(即梦)

1.打开即梦网页版 https://jimeng.jianying.com/ai-tool/home 2.图片生成-导入参考图&#xff08;这里原本的红色或者灰度图都是可以的&#xff09;-精细度5&#xff08;最高图质量越高&#xff09; 注&#xff1a;根据需要&#xff0c;选择不同的生图模型&#xff0c;具有…

线上监控诊断 - Arthas

简介 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并且能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;…

SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)

1. 背景 在 SAPUI5 中&#xff0c;Fragments 是一种轻量级的 UI 组件&#xff0c;类似于视图&#xff08;Views&#xff09;&#xff0c;但它们没有自己的控制器&#xff08;Controller&#xff09;。Fragments 通常用于定义可以在多个视图中重用的 UI 片段&#xff0c;从而提…

项目实战1(30小时精通C++和外挂实战)

项目实战1&#xff08;30小时精通C和外挂实战&#xff09; 01-MFC1-图标02-MFC2-按钮、调试、打开网页05-MFC5-checkbox及按钮绑定对象06--文件格式、OD序列号08-暴力破解09-CE10-秒杀僵尸 01-MFC1-图标 这个外挂只针对植物大战僵尸游戏 开发这个外挂&#xff0c;首先要将界面…

FPGA:流水灯设计

本次基于FPGA实现流水灯&#xff0c;即让LED[0:7]从左到右依次电量&#xff0c;每个LED灯频闪周期为1s钟&#xff0c;在这里&#xff0c;给出下面三种实现思路&#xff1a; 1、实验思路 1、使用位运算符 在复位时令LED灯为LED8’b0000_0001&#xff0c;然后每过一秒钟&#x…

软考:软件设计师 — 7.软件工程

七. 软件工程 1. 软件工程概述 &#xff08;1&#xff09;软件生存周期 &#xff08;2&#xff09;软件过程 软件开发中所遵循的路线图称为 "软件过程"。 针对管理软件开发的整个过程&#xff0c;提出了两个模型&#xff1a;能力成熟度模型&#xff08;CMM&#…

嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化:智能物流管理系统设计思路流程(附代码示例)

目录 项目概述 系统设计 硬件设计 软件设计 系统架构图 代码实现 1. STM32微控制器与传感器代码 代码讲解 2. MQTT Broker设置 3. 数据接收与处理 代码讲解 4. 数据存储与分析 5. 数据分析与可视化 代码讲解 6. 数据可视化 项目总结 项目概述 随着电子商务的快…

简单小案例分析

一、容器和实例关系 <div class"app"><h1>Hello,{{name}}</h1> </div> <div class"app"><h1>Hello,{{name}}</h1> </div><script>//创建Vue实例new Vue({el:".app", //el用于指定当前V…

暴风骑士S9电摩上市,定义青少年骑行安全新标准

暴风骑士&#xff0c;作为全球高端儿童电动车的开创品牌&#xff0c;以其卓越的技术实力和创新精神&#xff0c;不断推动行业发展。如今&#xff0c;暴风骑士再次突破自我&#xff0c;推出了全新力作——S9青少年电摩。这款全新上市的青少年专属电摩&#xff0c;以其领先的安全…

LCD 横屏切换为竖屏-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

LCD 横屏切换为竖屏 横屏显示如何切换为竖屏显示 LCD 屏默认横屏显示 开发板配套的 LCD 屏默认都是横屏显示&#xff0c;如 4.3 寸、7 寸和 10.1 寸的不同分辨率的 RGB LCD 屏 固定坐标体系 &#xff08;以 800*480 分辨率为例&#xff09;横屏模式下的固定坐标&#xff1a;…

某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC]

文章目录 某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内…