系列文章目录

【mybatis plus源码解析】(一)mybatis plus执行原理
【mybatis plus源码解析】(二)详解自定义SQL注入器底层原理
【mybatis plus源码解析】(三)自定义SQL注入器,如何自定义扩展BaseMapper方法,实现更多查询


文章目录

  • 系列文章目录
  • 前言
  • 一、创建测试环境,照着官网整就完事了,这里就不说了
  • 二、自定义新方法SelectByUserId,可以实现通过传入userId查询
  • 自定义基础Mapper接口类
  • 自定义扩展MySqlInjector sql注入器
  • 配置使用新的sql注入器
  • 这里就配置完成了,来看看使用
    • Mapper类实现我们新的CustomizeMapper接口
    • 项目中调用

前言

前面讲了sql注入器的原理,现在我们尝试自定义扩展一些方法

一、创建测试环境,照着官网整就完事了,这里就不说了

二、自定义新方法SelectByUserId,可以实现通过传入userId查询

注意,这里限制只有实体类有名为userId属性才能注入这个方法,如不满足后续调用会报错

/*** @author resthx* @date 16:19 2022/3/30*/
public class SelectByUserId extends AbstractMethod {public SelectByUserId() {super("selectByUserId");}/*** @param name 方法名* @since 3.5.0*/public SelectByUserId(String name) {super(name);}@Overridepublic MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {String sql = "SELECT %s FROM %s WHERE %s=#{%s} %s";List<TableFieldInfo> fieldList = tableInfo.getFieldList();boolean isAdd = false;for (TableFieldInfo fieldInfo : fieldList) {String property = fieldInfo.getProperty();String name = fieldInfo.getField().getName();if ("userId".equals(property)){String column = fieldInfo.getColumn();SqlSource sqlSource = new RawSqlSource(configuration, String.format(sql,sqlSelectColumns(tableInfo, false),tableInfo.getTableName(), column, property,tableInfo.getLogicDeleteSql(true, true)), Object.class);return this.addSelectMappedStatementForTable(mapperClass, methodName, sqlSource, tableInfo);}}return null;}
}

自定义基础Mapper接口类

/*** @author resthx* @date 15:25 2022/3/30*  自定义扩展基础mapper,附加可以通过userId查询的方式*/
public interface CustomizeMapper<T> extends BaseMapper<T>{/*** 通过用户id查找* @param userId* @return*/List<T> selectByUserId(@Param("userId")Long userId);
}

自定义扩展MySqlInjector sql注入器

/*** @author resthx* @date 16:16 2022/3/30* 自定义扩展sql、注入器*/
public class MySqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);//增加自定义方法methodList.add(new SelectByUserId());return methodList;}
}

配置使用新的sql注入器

/*** @author jiliugang* @date 16:42 2022/3/30*/
@Configuration
public class MybatisPlusConfig {@Beanpublic MySqlInjector sqlInjector() {return new MySqlInjector();}
}

这里就配置完成了,来看看使用

Mapper类实现我们新的CustomizeMapper接口

/**
* @author resthx
* @description 针对表【ry_order】的数据库操作Mapper
* @createDate 2022-03-30 16:13:55
* @Entity com.example.mybatisplussqlinjector.domain.RyOrder
*/
public interface RyOrderMapper extends CustomizeMapper<RyOrder>{}

项目中调用


结果

测试成功,只要实现新定义这个接口就拥有了通过userId查询的方法

【mybatis plus源码解析】(三)自定义SQL注入器,教你如何自定义扩展BaseMapper接口方法,实现更多查询相关推荐

  1. Disruptor源码解析三 RingBuffer解析

    目录 系列索引 前言 主要内容 RingBuffer的要点 源码解析 系列索引 Disruptor源码解析一 Disruptor高性能之道 Disruptor源码解析二 Sequence相关类解析 D ...

  2. MyBatis(12) 源码解析之SQL执行流程

    一.前言 资料 mybatis文档:https://mybatis.org/mybatis-3/index.html mybatis源码:https://github.com/mybatis/myba ...

  3. 并发编程与源码解析 (三)

    并发编程 (三) 1 Fork/Join分解合并框架 1.1 什么是fork/join ​ Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,开发者可以在不去了解如Thread.R ...

  4. OkHttp3源码解析(三)——连接池复用

    OKHttp3源码解析系列 OkHttp3源码解析(一)之请求流程 OkHttp3源码解析(二)--拦截器链和缓存策略 本文基于OkHttp3的3.11.0版本 implementation 'com ...

  5. ReactiveSwift源码解析(三) Signal代码的基本实现

    上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...

  6. 前端入门之(vuex源码解析三)

    上两节前端入门之(vuex源码解析二)我们把vuex的源码大概的撸了一遍,还剩下(插件.getters跟module),我们继续哈~ 插件童鞋们可以去看看vuex在各个浏览器的状态显示插件,小伙伴可以 ...

  7. 拆轮子-RxDownload2源码解析(三)

    本文为博主原创文章,未经允许不得转载 造轮子者:Season_zlc 轮子用法请戳作者链接 ↑ 前言 本文主要讲述 RxDownload2 的多线程断点下载技术. 断点下载技术前提 服务器必须支持按 ...

  8. java的jdbc看不到源码_不了解jdbc,何谈Mybatis的源码解析?

    这篇文章主要用来展示jdbc的使用,是为了方便阅读MyBatis源码使用的,为源码分析做一个提前热身: 里面很多关键性的信息在MyBatis源码里面都能找到,本篇不做MyBatis源码的分析, 因为M ...

  9. Tomcat源码解析三:tomcat的启动过程

    Tomcat组件生命周期管理 在Tomcat总体结构 (Tomcat源代码解析之二)中,我们列出了Tomcat中Server,Service,Connector,Engine,Host,Context ...

  10. 【Vue.js源码解析 三】-- 模板编译和组件化

    前言 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:建议通过左侧导航栏进行阅读 模板编译 模板编译的主要目的是将模板 (template) 转换为渲染函数 (render) <div> ...

最新文章

  1. SAP MM 物料主数据consumption视图数据的更新?
  2. 论文阅读:Joint Learning of Single-image and Cross-image Representations for Person Re-identification
  3. 基于组件的案例:购物车
  4. C++覆盖和重载的区别
  5. Kinect安装与配置(openNI2)
  6. python的总结与心得词云设计理念_Python编程语言:使用词云来表示学习和工作报告的主题...
  7. 【Envi风暴】ENVI中求两幅遥感影像的相关性(相关系数)
  8. 很久没来了,嘿嘿 问候一下大家,O(∩_∩)O哈哈~
  9. java replace stringbuilder_java.lang.StringBuilder.replace()方法实例
  10. 关键时刻不可或缺的5款高科技紧急应用
  11. 5月份----要做的
  12. 如何改变炒股频繁交易的毛病?
  13. 三向合并和 Git 的合并策略,手把手教你Git 合并
  14. linux 卸载jdk和安装 -凌晨的光
  15. 四、登录注册页功能实现《iVX低代码/无代码个人博客制作》
  16. IsPostBack详解
  17. re2020 bt2020_2020年最好的4个在线学习平台
  18. c语言ctype函数指针,ctype调用DLL中的函数问题已经成功解决
  19. 【双轨】分销+量碰+返利+加权分红源码系统 演示网站
  20. anaconda出现Multiple Errors Encountered.

热门文章

  1. 南京大学软件学院考研计算机网络汇总
  2. android x86 联网,没有网络连接 – VMWare Fusion上的Android-x86
  3. 年会抽奖程序,及时安排一波【开源项目】
  4. HTML5+CSS大作业——年会抽奖网页设计(1页)
  5. edem颗粒替换_EDEM离散元软件中颗粒替换与填充编程模版
  6. 计算机软件考试难,计算机技术与软件专业技术资格考试难吗
  7. Hprose轻松实现远程过程调用(RPC)
  8. js 复制div文本
  9. STM32工程,Keil软件新建工程详细步骤
  10. vs2003无法打开sal.h