mybatis-plus高级功能之实现自定义通用方法

前言
MP在一开始就给大家提供了很多通用的方法,在DefaultSqlInjector这个类中,在MethodList这个集合当中包含的都是通用方法类,如果想要使用自定义通用方法,也需要添加到这个集合当中。

public class DefaultSqlInjector extends AbstractSqlInjector {@Overridepublic List<AbstractMethod> getMethodList() {return Stream.of(new Insert(),new Delete(),new DeleteByMap(),new DeleteById(),new DeleteBatchByIds(),new Update(),new UpdateById(),new SelectById(),new SelectBatchByIds(),new SelectByMap(),new SelectOne(),new SelectCount(),new SelectMaps(),new SelectMapsPage(),new SelectObjs(),new SelectList(),new SelectPage()).collect(toList());}
}

实现自定义方法-以删除时填充为例:
创建自定义方法的类
类名是DelFillUserMethod,这个是自定义的,但是最好是见名知意的类名。
继承AbstractMethod抽象类,AbstractMethod是抽象的注入方法类,每个通用方法也都继承了这个类,也是为了方便调用里面的方法
重写injectMappedStatement方法,injectMappedStatement内是我们完成我们这个方法具体的逻辑。
CustomSqlMethod是自定义的枚举类,我在下面已经贴出来了,这样可以使代码更优雅,我没有选择用官方提供的SqlMethod,是因为我怕到时候不容易维护。
具体内容我在代码中也有注释。

public class DelFillUserMethod extends AbstractMethod {@Overridepublic MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {// 获取用户信息String userId = UserContext.getCurrent() == null ? null : UserContext.getCurrent().getId2();String userName = UserContext.getCurrent() == null ? null : UserContext.getCurrent().getName();// set 语句String set = "set useflag = 0,deletetime = now(),operatetime = now()";if (StringUtils.isNotBlank(userId)) set += ",set deleterid = " + userId;if (StringUtils.isNotBlank(userName)) set += ",set deleter = " + userName;// 拿到我们定义好的枚举CustomSqlMethod sqlMethod = CustomSqlMethod.DEL_FILL_USER;/** * 组装自己的sql */String sql =String.format(// 定义好的sqlsqlMethod.getSql(),// 表名tableInfo.getTableName(),// set 的值set,// 主键(数据库字段名)tableInfo.getKeyColumn(),// 实体类属性名tableInfo.getKeyProperty(),// and 主键 = yes | 如果是false的话就是 and 主键 = notableInfo.getLogicDeleteSql(true, true));// 动态SQL标签处理器SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Object.class);// 交给mp大佬们处理执行return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);}
}

CustomSqlMethod枚举类内容

/*** @auther: zpq* @date: 2020/11/10 14:29* @description: 自定义通用sql与方法名称*/
public enum CustomSqlMethod {/*** 插入*/INSERT_ONE("insert", "插入一条数据(选择字段插入)", "<script>\nINSERT INTO %s %s VALUES %s\n</script>"),/*** 删除*/DELETE_BY_ID("deleteById", "根据ID 删除一条数据", "<script>\nDELETE FROM %s WHERE %s=#{%s}\n</script>"),/*** 逻辑删除*/LOGIC_DELETE_BY_ID("deleteById", "根据ID 逻辑删除一条数据", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),/*** 逻辑删除 -> 修改*/DEL_FILL_USER("delFillUser", "删除填充用户信息", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"),BATCH_DEL_FILL_USER("batchDelFillUser", "批量删除填充用户信息", "<script>\nUPDATE %s %s WHERE %s IN (%s) %s\n</script>"),/*** 查询*/SELECT_OBJS("selectObjs", "查询满足条件所有数据", "<script>%s SELECT %s FROM %s %s %s\n</script>");private final String method;private final String desc;private final String sql;CustomSqlMethod(String method, String desc, String sql) {this.method = method;this.desc = desc;this.sql = sql;}public String getMethod() {return method;}public String getDesc() {return desc;}public String getSql() {return sql;}}

创建注入器,并把自定义的方法添加到集合当中。
类名是CustomSqlInjector,自定义的
继承DefaultSqlInjector并重写getMethodList,SQL 默认注入器上面也有提到过,我们得把我们自定义的方法加入到通用方法的集合methodList当中

/*** @auther: * @date: * @description: 自定义sql注入器* 把自定义的通用方法加入mp的方法集合*/
@Component
public class CustomSqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {// 这里很重要,先要通过父类方法,获取到原有的集合,不然会自带的通用方法会失效的List<AbstractMethod> methodList = super.getMethodList(mapperClass);/**** 添加自定义方法类*/methodList.add(new DelFillUserMethod());methodList.add(new BatchDelFillUserMethod());return methodList;}
}

最后一步就是在*.dao.*Mapper中加入自定义方法 如下:

  /*** @Description: 删除并填充删除人信息** @param: id 主键id*/int delFillUser(Serializable id);

其实以上就算完成了,但是如果同时有好几个Mapper需要用到这个自定义通用方法,这样可能不是那么优雅。
我们创建一个通用SuperMapper,然后继承BaseMapper,这样的话,用到这个方法的mapper只需要继承SuperMapper就可以了,如下:

/*** @description: 通用mapper*/
public interface SuperMapper<T> extends BaseMapper<T> {/*** @Description: 删除并填充删除人信息** @param: id 主键id* @auther: zpq* @date: 2020/11/10 11:47 上午*/int delFillUser(Serializable id);/*** @Description: 批量删除并填充删除人信息** @param: idList 主键ID列表(不能为 null 以及 empty)* @auther: zpq* @date: 2020/11/10 3:12 下午*/int batchDelFillUser(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
}

你可能也已经发现自定义的批量操作的通用方法,我直接贴出来:

/*** @description: 批量删除填充用户信息*/
public class BatchDelFillUserMethod extends AbstractMethod {@Overridepublic MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {// 获取用户信息String userId = UserContext.getCurrent() == null ? null : UserContext.getCurrent().getId2();String userName = UserContext.getCurrent() == null ? null : UserContext.getCurrent().getName();// 自己组装sqlString set = "set useflag = 0,deletetime = now(),operatetime = now()";if (StringUtils.isNotBlank(userId)) set += ",set deleterid = " + userId;if (StringUtils.isNotBlank(userName)) set += ",set deleter = " + userName;// 拿到我们定义好的sqlCustomSqlMethod sqlMethod = CustomSqlMethod.BATCH_DEL_FILL_USER;// 填充sqlString sql =String.format(sqlMethod.getSql(),tableInfo.getTableName(),set,tableInfo.getKeyColumn(),// foreach in(ids)SqlScriptUtils.convertForeach("#{item}", COLLECTION, null, "item", COMMA),tableInfo.getLogicDeleteSql(true, true));// 动态SQL标签处理器SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Object.class);return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);}
}

结束语:
到此mybatis-plus高级功能 实现自定义通用方法详解就结束了,其实很简单,写其他方法也一样,对照着mybatis-plus源码照着抄就行
可以看下SelectList方法,照着写就行,basemapper中每个方法对应就是一个类,不同的要求按照不同的类照着写就行

package com.baomidou.mybatisplus.core.injector.methods;import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;public class SelectList extends AbstractMethod {public SelectList() {this(SqlMethod.SELECT_LIST.getMethod());}public SelectList(String name) {super(name);}public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {SqlMethod sqlMethod = SqlMethod.SELECT_LIST;String sql = String.format(sqlMethod.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlOrderBy(tableInfo), this.sqlComment());SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);return this.addSelectMappedStatementForTable(mapperClass, this.methodName, sqlSource, tableInfo);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript学习笔记(三)

19、JavaScript 数组排序 19.1 数组排序&#xff1a;sort() sort() 方法以字母顺序对数组进行排序&#xff1a; <p id"demo"></p><script>var cars01 ["Apple", "City", "Dog", "Bad"];document.getEl…

《梦醒蝶飞:释放Excel函数与公式的力量》 5.2VLOOKUP函数

第二节 5.2VLOOKUP函数 HLOOKUP函数&#xff1a;水平查找的能手&#xff0c;在Excel中&#xff0c;HLOOKUP函数&#xff08;Horizontal Lookup的缩写&#xff09;是执行水平查找的函数&#xff0c;它允许你根据一个关键值在表格的第一行中查找&#xff0c;并返回同一列中另一个…

模组硬件通用丨模组USB电路设计指南

USB&#xff08;全称&#xff1a;Universal Serial Bus&#xff09;是一种串口总线标准&#xff0c;也是一种输入输出接口的技术规范&#xff0c;广泛应用于个人电脑和移动设备等信息通讯产品&#xff0c;并扩展至摄影器材、数字电视&#xff08;机顶盒&#xff09;、游戏机等相…

本地可以Run大模型吗?Llama3?安排!

➡️ 前言 本地可以跑大模型吗? ChatGPT发布之后&#xff0c;引起了AI领域剧烈震动&#xff0c;从2023年3月百度发布新一代大预言模型文心一言开始&#xff0c;大模型如雨后春笋般不断涌现&#xff0c;国内阿里巴巴的通义千问、华为的盘古大模型、科大讯飞的星火认知大模型、…

木材容易发霉怎么办除霉处理方法

木材存放不当就容易出现发霉情况&#xff0c;那么可通过那些方法将木材表面的霉斑除掉呢&#xff1f;经ihaoer防霉人士介绍处理木材发霉处理方法如下&#xff1a; 木材发霉的原因主要包括木材本身的营养物质、环境湿度、温度以及空气流动性等因素。木材中含有蛋白质、淀粉、油类…

【面试题】Linux 下 MakeFile(第一篇)

1.请简单介绍Makefile是什么&#xff1f; Makefile是用于编译和管理项目的一组规则和指令。它保存了编译器和连接器的参数选项&#xff0c;还表述了所有源文件之间的关系&#xff08;如源代码文件需要的特定包含文件&#xff0c;可执行文件要求包含的目标文件模块及库等&#x…

CPR曲面重建代码

废话不说&#xff0c;直接上代码&#xff1a; #include "vtkAutoInit.h" #include "vtkPolyData.h" #include "vtkProbeFilter.h" #include "vtkParametricFunctionSource.h" #include "vtkParametricSpline.h" #include &…

基于Java微信小程序校园自助打印系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

2024年江苏省13市科技企业上市培育计划入库企业申报条件程序和截止时间

一、江苏省13市科技企业上市培育计划入库企业申报条件 1.企业属于有效期内高新技术企业&#xff0c;申报时须在我省行政区域内成立三年以上&#xff0c;经营状况良好&#xff0c;已设立或拟设立为股份有限公司&#xff0c;且尚未在主板、创业板、科创板、北证上市或在“新三板…

计算机网络知识点(八)

目录 一、简述HTTP常见的响应状态码及其含义 1、解析 2、分类 二、简述GET请求和POST请求的区别 三、简述Cookie和Session的区别 四、简述HTTPS的加密与认证过程 一、简述HTTP常见的响应状态码及其含义 1、解析 ①200&#xff1a;从状态码发出的请求被服务器正常处理。 …

【开源项目】智慧北京案例~超经典实景三维数字孪生智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码!

飞渡科技数字孪生北京管理平台&#xff0c; 依托实景数字孪生底座&#xff0c;以城市感知网络为硬件基础&#xff0c;以城市大数据为核心资源&#xff0c;以数字孪生、云计算、人工智能为关键技术&#xff0c;实现城市产业规划、资产安全管理、城市能耗监控等一体化空间融合。 …

CP AUTOSAR标准之FlexRayStateManager(AUTOSAR_CP_SWS_FlexRayStateManager)(更新中……)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块FlexRay状态管理器(FrSM)的功能、API和配置。   AUTOSAR BSW堆栈为每条通信总线指定一个总线特定状态管理器。该模块应实现相应总线的控制流。FrSM是通信服务层的成员。它与通信硬件抽象层和系统服务层交互。 3 相关文献 …

基于电商模式的性能测试(2) —— 使用Jmeter参数化功能+JSR223 PreProcessor+JSON Extractor完成注册登录的数据驱动

1、前置条件 此例使用的是GitHub上一个开源的电商项目mall&#xff0c;需要的可以去GitHub上下载部署&#xff0c;有详细的部署教程&#xff1a; GitHub地址&#xff1a;github.com/macrozheng/…部署教程&#xff1a;macrozheng.github.io/mall-learni… 2、场景抽离 首先要…

C#的无边框窗体项目模板 - 开源研究系列文章

继续整理和编写代码及博文。 这次将笔者自己整理的C#的无边框窗体项目的基本模板进行总结&#xff0c;得出了基于C#的.net framework的Winform的4个项目模板&#xff0c;这些模板具有基本的功能&#xff0c;即已经初步将代码写了&#xff0c;直接在其基础上添加业务代码即可&am…

java实现一个图的最短路径算法

import java.util.*; //java实现一个图的最短路径算法 public class Test_34 { // 定义一个常量INF&#xff0c;表示无穷大。private static final int INF Integer.MAX_VALUE; // 定义一个方法dijkstra&#xff0c;接受一个二维数组图和一个起始节点作为参数。public s…

七牛云 Miku 快直播,陪你一起看球!

足球&#xff0c;作为全球最受欢迎的运动之一&#xff0c;每一次大赛都是球迷心中的狂欢&#xff0c;每一场比赛都记录着足球历史的精彩。 2000 年&#xff0c;特雷泽盖的金球&#xff0c;照亮了法兰西的足球梦想。 2004 年&#xff0c;查理斯特亚斯的头槌破门&#xff0c;成就…

小甲鱼——集合

一什么是集合 type({}) <class dict> #字典 type({"one"}) <class set> #集合type({"one":1}) <class dict> #字典 跟集合一样&#xff0c;字典最大的特性就是——唯一性 即&#xff1a;集合中的所有元素&#xff0c;都应该是独…

第15天:Vue.js应用的测试和调试

第15天&#xff1a;Vue.js应用的测试和调试 目标 学习Vue.js应用的测试和调试方法&#xff0c;包括E2E&#xff08;端到端&#xff09;测试和单元测试。 任务概览 学习单元测试基础。探索E2E测试框架。实现Vue组件的测试。 详细步骤 1. 单元测试基础 单元测试是对应用中…

浅谈逻辑控制器之while控制器

浅谈逻辑控制器之while控制器 “While控制器”是一种高级控制结构&#xff0c;它允许用户基于特定条件来循环执行其下的子采样器或控制器&#xff0c;直至该条件不再满足。本文旨在详细介绍While控制器的功能、配置方法、使用场景以及实践示例&#xff0c;帮助测试工程师高效利…

上海市计算机学会竞赛平台2023年8月月赛丙组下降幂多项式

题目描述 &#x1d465;x 的 &#x1d458;k 次下降幂定义为 &#x1d465;(&#x1d458;)(&#x1d465;)(&#x1d465;−1)(&#x1d465;−2)⋯(&#x1d465;−&#x1d458;1)x(k)(x)(x−1)(x−2)⋯(x−k1) &#x1d465;x 的下降幂多项式是由 &#x1d465;x 的一组…