高中生都知道:Mybatis-Plus如何生成内置Sql的?

一:文章背景

本文从源码的角度进行分析Mybatis-Plus,为了阅读且吸收的更顺利,希望读者有以下基础:

  • 对Java、Spring、Mybatis、Mybatis-Plus有一定的了解/使用基础
  • 对底层源码有略微学习,哪怕是为了框架二开、框架扩展或知识储备
  • 本文章参考源码 3.4.2

二:问题带入

使用过Mybatis-Plus的同学都知道不需要写xml即可使用默认的【单表】的增删改查及单表的复杂查询。
请思考以下问题:

  1. 为什么用了Mybatis-Plus就不需要写xml文件,只需要写一个接口继承BaseMapper?
  2. 在什么时候Mybatis-Plus将动态sql预埋了、预埋的字段内容有哪些?
  3. 如何优雅的新增自定义Mapper内置方法?

三:源码分析

先回答以上三个问题

3.1 为什么用了Mybatis-Plus就不需要写xml文件,只需要写一个接口继承BaseMapper?

总所周知:

1.Mybatis通过动态代理Mapper接口方法/SqlSession两种形式暴露给业务使用,其中Mapper接口的方式使用较多。
2.可以通过原生SqlSessionFactory.getMapper(),或者通过spring版本的Mybatis通过将MapperFactoryBean封装原生的Mapper生成Bean供业务访问。

同时,Mybatis-Mapper和xml的关系

Mybatis在扫描Xml时会根据namespace是否是接口来解决是否对接口生成动态代理,也就是我们理解的Mapper接口。

image.png
回答此问题:

生成Mapper接口的方法有两种:
1.扫描xml,将其Namespace对应的接口Configuration的addMapper方法生成动态代理Mapper接口。

2.spring版本mybatis,扫描Mapper接口,生成对应的MapperFactoryBean,其继承了DaoSupport接口并在其实现了InitializingBean接口方法中调用Configuration的addMapper方法,生成Mapper接口

3.mybatis-plus是通过重写Configuration的addMapper方法,在其扫描Mapper接口时,通过对BaseMapper中预埋的增删改查方法进行添加到Mybatis的MappedStatement。使得用户调用Mapper接口方法时能够找到其对应的MappedStatement。

补充:MappedStatement是Namespace下每个方法的映射对象。

image.png

3.2: 在什么时候Mybatis-Plus将动态sql预埋了、预埋的字段内容有哪些?

代码调用链路图
image.png
生成的预埋sql是什么样的呢?我们拿SelectList举例
主要有三部分组成:

1.QueryWrapper.sqlSelect:查询指定列,用于区分用户是否查询指定列,还是全列查询
2.AbstractWrapper.entity :实体部分,用ew.entity在动态sql中调用,此处用来等值查询(Update语句时,此字段用来做set更新字段)
3.Wrapper.sqlSegment: 此部分为动态条件(and、or、group、having、orderby)等条件生成的sql语句

动态sql代码组成
image.png
BaseMapper参数设置
image.png
QueryWrapper承接用户参数
image.png

综上所述可以总结:

场景:用户使用QueryWrapper调用Mapper接口进行SelectList查询
调用链路:
1.项目启动时已经生成了预埋的动态sql方法及MappedStatement
2.用户通过构造Querywrapper生成动态条件,即动态sql中【ew】字段属性
3.通过调用父类BaseMapper接口方法走向Mapper接口动态代理,进而走向Mybatis的Sqlsession执行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】循环、控制流语句、指针

8、循环(loops)(1)for loops for循环非常灵活,可以做很多事情。上图红框框出来的代码块就是一个for循环。 for是关键字 for后面内容分为三部分,每部分用分号;隔开 第一部分A是变量的声明&…

20240623(26.0) 重要财经新闻

财经关注 ► 券商中国:北交所于6月21日晚间受理了3家企业的IPO申请。6月20日晚间,沪深交易所各受理了1家IPO申请。这也意味着,三大交易所IPO受理全部恢复。与此同时,三大交易所IPO上市委会议也已经全部重启。 ► 全球多地近期遭遇…

【数据挖掘】机器学习中相似性度量方法-切比雪夫距离

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至&#…

群体优化算法---电磁共振优化算法(EROA)介绍包含示例滤波器设计

介绍 电磁共振优化算法(Electromagnetic Resonance Optimization Algorithm, EROA)是一种新型的元启发式优化算法,其灵感来源于电磁共振现象。电磁共振是一种物理现象,当一个系统在特定频率下响应最大时,这个频率被称…

数据结构和算法(1) ---- Queue 的原理和实现

Queue 的定义和结构 队列(Queue) 是只允许在一端进行插入,在另一端进行删除的线性表 队列是一种先进先出(First In First Out)的线性表,简称 FIFO(First IN First OUT), 允许插入的一端称为队尾, 允许删除的一端称为队列头 队列的基本结构如下图所示&a…

使用python绘制三维曲面图

使用python绘制三维曲面图 三维曲面图三维曲面图的用途效果代码 三维曲面图 三维曲面图是一种用于展示三维数据的图表,通过一个连续的曲面来表示数据的变化情况。它通常用于可视化数学函数或实验数据的三维关系,可以非常直观地展示变量之间的复杂关系。…

大电流与小电流在检测原理上有区别吗

1 常用电流检测原理 1.1 分流器原理 被测量的电流在输入端电阻上Rshunt形成电压正比于测量电流,通过同相比例电路进行放大输出。 缺点: 输入电流减小时,需要更大的Rshunt;输入电阻Rshunt串入检测回路内将引起被测电流减小&a…

App推广告别邀请码,Xinstall助您一键触达海量用户!

在移动互联网高速发展的今天,App的推广与运营已成为每个开发者都必须面对的问题。然而,随着互联网流量的日益分散和用户需求的不断变化,传统的App推广方式已经难以满足现代市场的需求。尤其是在获取用户时,很多开发者还在采用传统…

我们是否需要AI服务器?推动人工智能繁荣发展的AI服务器

揭穿人工智能服务器的炒作 人工智能的研究已经有几十年了,早在 1960 年代,生成式人工智能就已应用于聊天机器人。然而,2022 年 11 月 30 日发布的 ChatGPT 聊天机器人和虚拟助手席卷了 IT 界,让 GenAI 成为家喻户晓的术语&#x…

(2024.6.23)最新版MAVEN的安装和配置教程(超详细)

1.什么是MAVEN Maven是一个自动化构建工具,主要用于Java项目,它由Apache软件基金会维护。Maven能够自动化完成编译、测试、打包、发布等构建过程,可以大大提高开发效率,保证项目的质量。 下面我们从几个方面来介绍一下MAVEN的功能…

字节跳动:从梦想之芽到参天大树

字节跳动掌舵人:张一鸣 2012年:梦想的起点:在一个阳光明媚的早晨,北京的一座普通公寓里,一位名叫张一鸣的年轻人坐在电脑前,眼中闪烁着坚定的光芒。他的心中有一个梦想——通过技术改变世界,让…

PHP米表域名出售管理源码带后台

源码介绍 html5米表源码PHP域名销售程序安装方法: 本站已测试,各项功能正常,功能易用,不复杂,非常适合个人米表使用 1、所有文件传至网站目录 2、浏览器执行http://你的访问网址/install 3、输入mysql帐号及密码信息,提交安装 源码截图 源码下载 …

【2024最新版】Java JDK安装配置全攻略:图文详解

目录 1. 引言2. 准备工作2.1 **确定操作系统**2.2 **检查系统要求**2.3 **下载JDK安装包**3. 安装步骤(以Windows系统为例)4. 配置环境变量4.1 jdk配置验证4.2 **配置JAVA_HOME环境变量**4.3 **配置Path环境变量**4.4 验证jdk是否配置成功 5. 结语 1. 引…

轻松重命名Windows用户Users目录下的文件夹名称

设置系统还原点 为避免设置失败,需提前准备好系统还原点以备份恢复系统。 打开系统属性: 在“系统保护”选项卡中,选择你想要保护的系统驱动器(通常是C:驱动器)。 点击“配置”按钮。 在弹出的窗口中,选…

opencascade AIS_InteractiveContext源码学习1 object display management 对象显示管理

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行…

20240623 每日AI必读资讯

🤖原生鸿蒙AI浓度要爆表了! - 一年一度华为开发者大会上,余承东首次揭秘“鸿蒙原生智能”Harmony Intelligence! - 华为小艺进化成系统级智能体。 - 一句话实现跨多个应用的规划和任务执行;在第三方APP上随意处理文…

NSIS 入门教程 (三)

引言 在教程的第二部分中,我们为安装程序增加了一个卸载程序,并查看了一些其他的向导页面以及安装部分的选择。第三部分的目标是使安装程序的外观更加现代化。 更现代的外观 为了给安装程序一个更现代的外观,我们要启用现代用户界面。要提…

java基于ssm+jsp 社区疫情防控管理信息系统

1前台首页功能模块 社区疫情防控管理信息系统,在社区疫情防控管理信息系统可以查看首页、物品信息、论坛信息、新闻资讯、我的、跳转到后台等内容,如图1所示。 图1系统首页界面图 用户登录、用户注册,通过注册填写账号、密码、姓名、身份证、…

supOS浅度集成

一、浅度集成介绍 浅度集成是根据项目或者演示要求而做的集成工作,通过接入supOS的单点登录,UI调整,菜单栏的集成,从而达到客户使用supOS平台来使用各个应用的能力。 二、浅度集成的作用 通过较少的研发投入使APP应用浅度融入到…

密码学-密码协议之零知识证明

一、前言 零知识证明实际上一种密码协议,该协议的一方称为证明者(Prover),通常用P表示,协议的另一方是验证者(Verifier),一般用V表示。零知识证明是指P试图使V相信某个论断是正确的,但却不向V提供任何有用的信息&…