Mybatis 源码学习(二) Mapper 接口和sql的映射

Mybatis接口Mapper内的方法为啥不能重载?Mapper的源码分析 精髓:动态代理的功能:通过拦截器方法回调,对目标target方法进行增强。 言外之意就是为了增强目标target方法。上面这句话没错,但也不要认为它就是真理,殊不知,动态代理还有投鞭断流的霸权,连目标target都不要的科幻模式。 注:本文默认认为,读者对动态代理的原理是理解的,如果不明白target的含义,难以看懂本篇文章,建议先理解动态代理。 本文分享给需要面试刷题的朋友,也祝愿大家顺利拿到自己想要的offer,这份资料主要包含了Java基础,数据结构,jvm,多线程等等,由于篇幅有限,以下只展示小部分 阅读详情

问题:xml中的sql语句是怎么被映射到Mapper接口的一个方法上的?

弄明白了mapper是如何注册的了以后,发现xml文件中的namespace是关键。实际还是去找那个java接口文件。那么找到了接口文件,注册了mapper那这个mapper又是怎么反过来找到xml中配置的sql的呢?

看mapper注册的代码好想没有发现这个映射关系。从新再看一下源码,这次要顺利很很,很快找到了昨天那一串调用栈。

sqlSessionFactoryBuilder.build(inputStream);
return build(parser.parse());
parseConfiguration(parser.evalNode("/configuration"));
mapperElement(root.evalNode("mappers"));

然后找resource!=null的情况

 public void parse() {
    if (!configuration.isResourceLoaded(resource)) {
      configurationElement(parser.evalNode("/mapper"));//****关键的操作藏在了这里****
      configuration.addLoadedResource(resource);
      bindMapperForNamespace(); //这里就是去注册mapper的地方
    }

    parsePendingResultMaps();
    parsePendingChacheRefs();
    parsePendingStatements();
  }

  private void configurationElement(XNode context) {
    try {
      String namespace = context.getStringAttribute("namespace");
      builderAssistant.setCurrentNamespace(namespace);
      cacheRefElement(context.evalNode("cache-ref"));
      cacheElement(context.evalNode("cache"));
      parameterMapElement(context.evalNodes("/mapper/parameterMap"));
      resultMapElements(context.evalNodes("/mapper/resultMap"));
      sqlElement(context.evalNodes("/mapper/sql"));
      buildStatementFromContext(context.evalNodes("select|insert|update|delete"));//看到这里心里就大概明白了
    } catch (Exception e) {
      throw new RuntimeException("Error parsing Mapper XML. Cause: " + e, e);
    }
  }

继续往下看呢,代码就很长了,注意到一点,这些配置并没有关联到mapper上,而是最终直接添加到了Configuration对象的

mappedStatements

mappedStatements 是一个map,而且他的key是namespace加id。

debug了一下:


果然key就是"com.tiantao.learn.mappers.UserMapper.selectUser" namespace加上id。

同时还有一个只一个id,这两个都对应同一个对象。这么说来这个id应该是全局唯一的?!?!

记录一下调用栈


深入浅出MyBatis:Mapper接口的工作原理与使用流程 摘要:本文详细介绍了MyBatis框架中Mapper接口的工作原理及使用流程。Mapper接口通过动态代理机制实现SQL与Java代码解耦,核心组件包括MapperProxy、MapperMethod和MappedStatement。文章提供了从创建数据库、项目配置到测试的完整开发流程,重点讲解了动态代理实现原理和MyBatis配置文件设置,并对比了两种字段映射方式。通过理解这些机制,开发者可以更高效地使用MyBatis构建数据访问层,实现SQL与代码的优雅分离。(150字) 阅读详情

相关推荐

事件相机数据处理实战:从原始事件流到视觉表征的三种核心方法

本文深入探讨了事件相机数据处理的核心环节,即如何将异步、稀疏的原始事件流转换为深度学习模型可处理的视觉表征。文章重点解析了三种核心方法:逐通道累积、体素网格双线性插值和对称累积事件表示,详细阐述了其原理、代码实现、可视化效果及各自的适用场景,为事件相机在目标识别、光流估计等视觉任务中的高效应用提供了实战指南。

read5的博客 438

Mybatis源码解读-Mapper接口底层处理源码

Myabtis 源码解读-Mapper接口底层处理源码 1、Mapper接口底层设计类图 2、Mapper 接口底层处理流程图 3、Mapper 接口结合spring调用流程图 4、Mapper 代理对象生成处理流程

源码老人的专栏 1566

TCGA数据集介绍及数据下载指南(新手友好篇)

目录一、TCGA数据集介绍1.1 数据集介绍1.2 File介绍1.2.1 Data Category(数据类别)1.2.2 Data Type(数据类型)1.2.3 Experimental Strategy(实验策略)1.2.4 Workflow Type(工作流类型)1.2.5 Data Format(数据格式)1.2.6 Platform(平台)1.2.7 Access1.3 Cases介绍1.3.1 Case ID(案例编号)1.3.2 Primary Site(主要站点)1.3.3 Progra

Wendy的博客 6万+

【java]获取mapper.xml中的sql语句

import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.mapping.ParameterMode; import org.apache.ibatis.reflection.MetaObject; import org.a...

依旧的博客 4330

智能车竞赛飞檐走壁组立体赛道电磁引导线设计与实现

本文深入解析了智能车竞赛飞檐走壁组立体赛道电磁引导线的核心设计与实现。针对垂直面、圆筒、跷跷板等立体元素,详细阐述了电磁线规格参数选择、三维空间铺设技巧及磁场调试方法,旨在帮助参赛队伍打造稳定可靠的导航系统,提升车模在复杂立体赛道上的通过率与稳定性。

bert9linguist的博客 279

基于步科(Kinco HMI 2.5)的组态软件使用

本篇介绍Kinco HMI 2.5的组态软件使用,图标如下 目录   一、新建工程并配置连接 1.1 根据工程选择PLC与HMI型号 1.2 配置PLC连接与选项 二、组态画面编辑 2.1 打开画面窗口 2.2 编辑画面 2.3 组态变量与PLC程序变量连接 三、组态程序下载到HMI 3.1 连接 3.2 编译 3.3 下载 一、新建工程并配置连接 1.1 根据工...

ACanswer的专栏 1万+

IDEA中从mapper层中的方法直接调到对应的XML文件中的SQL语句

IDEA中从mapper层中的方法直接调到对应的XML文件中的SQL语句 下载安装Free Mybatis Plugins即可 File->Settings->Plugins 重启后进入Mapper层可以看到方法及接口名前面都有了箭头 点击即可跳转到对应的XML中的SQL语句 ......

LikeCode的博客 2965

如何免费访问和使用Gemini API?

Gemini Ultra具有最先进的性能,在几个指标上超过了GPT-4的性能。它是第一个在大规模多任务语言理解基准测试中超越人类专家的模型,该基准测试57个不同学科的世界知识和解决问题的能力。Gemini是谷歌迄今为止开发的最先进、最庞大的AI模型。它为多模态而建,理解并处理不同类型的数据,比如文本、代码、音频、图像和视频。下面我们将加载Masood Aslami的图像,并用它来测试Gemini Pro Vision的多模态性。有了Gemini可以为查询提供图像、音频和文本,获得几乎完美的答案。

java_cjkl的博客 1万+

mybatis-mapper2sql:IDEA Mybatis插件,实现自动提取sql

mybatis-mapper2sql:IDEA Mybatis插件,实现自动提取sql

handsomestWei的博客 1002

实战:RK3568 Android14 点亮 LVDS 屏幕

4组数据 (D0~D3) + 1组时钟 (CLK)。最大支持 1280x800 @ 60Hz。8组数据 (Even03, Odd03) + 2组时钟。支持 1080P 及以上。/ {/* 背光与电源 *//** 关键配置:数据格式映射* 可选值: "jeida-18", "jeida-24", "vesa-24"* 6位屏选 xx-18, 8位屏选 xx-24* 颜色不对(偏色/底片效果)就换 VESA <-> JEIDA*/

qq_33427070的博客 1164

Windows 11 安装 uv:手动下载、配置国内源

本教程详细介绍了在 Windows 11 系统下安装并配置 Python 包管理器 uv 的完整流程,包括配置环境变量 PATH、设置清华 PyPI 镜像源,以及创建收据文件以支持未来更新。适用于因网络限制无法通过官方脚本自动安装的用户,操作步骤清晰,配有图文指引,帮助读者高效完成本地部署。

寒水馨 · 轻量级技术文档 · hanshuixin.org 7595

Mybatis源码解析:sql参数处理(1)

当sql带有参数时,Mybatis是如何处理的。使用的是User类。 //省略get set方法 public class User { private int id; private String name; private String phone; } 例1 带有全局变量的sql //UserMapper中的dao接口 List<User> getByglobal(); <select id="getByglobal" resultType.

qfzhaohan的博客 528

Arcgis模型构建器01——写一个简单的模型

在使用模型构建器解决这个需求之前,我们要想清楚如果我们手动解决的话,应该如何去处理,因为构建模型的过程正是基于我们手动处理的过程来构建的。我有一个全国的dem影像数据和一个陕西省边界范围矢量,现在我想获取陕西省的dem影像的坡度数据。填写完之后点击确定,我们发现,两个输入数据和工具连接起来了,并且通过裁剪工具得到一个中间结果,即。我们发现工具框和中间数据框都存在阴影,说明已经运行过了这个模型,不报错就说明模型运行成功!现在我们就把数据和工具都串联起来了,成功构建好了模型。

爱吃雪糕的小布丁的博客 918

Mybatis2 - Mapper 详解

来源:https://www.bilibili.com/video/BV1V7411w7VW?p=3 这里写目录标题

qq_1403034144的博客 385

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Mybatis】- mapper.java和mapper.xml是如何映射起来的-源码分析

上篇博客我们讲到sqlSession是如何产生的。这篇博客我们讲讲mapper.java和mapper.xml是如何映射起来的。 程序中我们只有mapper.java接口,没有mapper实现类,那么是如何调用方法的呢? mybatis里所有mapper接口的实现类都可以看做是mapperProxy,mapper代理类,然后调用MapperProxy.invoke()方法,invoke()方法...

Brooks Lv 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MyBatis 源码分析 - SQL 的执行过程

文章目录* 本文速览1.简介2.SQL 执行过程分析2.1 SQL 执行入口分析2.1.1 为 Mapper 接口创建代理对象2.1.2 执行代理逻辑2.1.2.1 创建 MapperMethod 对象① 创建 SqlCommand 对象② 创建 MethodSignature 对象2.1.2.2 执行 execute 方法2.2 查询语句的执行过程分析2.2.1 selectOne 方法分析2.2.2 获取 BoundSql2.2.2.1 DynamicContext2.2.2.2 解析 SQL 片段2.

ThinkWon的博客 4428

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Mybatis源码05 - Mapper映射文件的配置

Mybatis源码05 - Mapper映射文件的配置

qq_43350524的博客 1148

MyBatis源码解析:从 Mapper 接口到 SQL 执行的完整链路

MyBatis源码解析:Mapper接口到SQL执行全流程 本文深入解析MyBatis从Mapper接口到SQL执行的完整链路:1)通过MapperProxyFactory创建动态代理对象;2)代理对象调用时触发MapperMethod处理;3)四大核心组件(Executor、StatementHandler、ParameterHandler、ResultSetHandler)协同完成SQL执行。揭示MyBatis如何将接口方法转化为SQL操作。

qq_45464560的博客 1131

Mybatis源码分析(三):mapper.xml的解析及namespace与Mapper接口的映射

概述 由上一篇文章分析可知,在调用SqlSessionFactoryBuilder的build方法创建SqlSessionFactory对象实例时,会首先调用builder包的xml子包的XMLConfigBuilder解析mybatisConfig.xml文件并创建和保存配置信息到Configuration对象,然后使用该Configuration对象作为参数场景SqlSessionFacto...

源码之下,了无秘密 5761

源码剖析 Mybatis 映射器(Mapper)工作原理

点击上方"田守枝的技术博客",关注我 Mybatis可以说是目前国内使用最广泛的ORM框架。最原始的使用方式下,我们将sql写在xml配置文件中,通过SqlS...

tianshouzhi的专栏 2370

MyBatis中Mapper接口的工作原理

MyBatis的Mapper接口通过动态代理机制实现数据库操作,其核心原理是:接口方法通过XML或注解配置SQL语句,运行时由JDK动态代理生成接口实例,拦截方法调用并自动解析namespace、方法名和参数,转换为底层SqlSession操作。这种方式封装了JDBC细节,简化了数据库访问,但需要注意Mapper接口不支持方法重载。整个流程包括定义规则、生成代理、解析信息、执行SQL和返回结果,体现了MyBatis在SQL灵活性和开发便捷性之间的平衡。

2301_80008738的博客 1072

Mybatis中mapper的实现原理

本文作者:钟昕灵,叩丁狼高级讲师。原创文章,转载请注明出处。  相信只要是使用过MyBatis开发的同学,都有使用其中的Mapper接口来开发,因为确实是很方便,方便到我们只需要编写接口而不需要写实现类,就能够完成对数据库的CRUD操作,但是不知道大家有没有去思考过,如果我们真的只有Mapper接口的话,程序又是如何去完成实际的业务的呢?来看看下面的代码 cn.wolfcode.mybatis...

wolfcode_cn的博客 1万+

MyBatis Mapper接口绑定详解

在当今的软件开发领域,MyBatis 作为一款优秀的持久层框架,以其简洁的配置和强大的功能,被广泛应用于各种项目中。然而,在实际开发过程中,我们常常会遇到如何高效地使用 MyBatis 进行数据库操作的问题。其中,Mapper 接口绑定是 MyBatis 的核心知识点之一,它直接关系到我们如何定义和调用数据库操作。想象一下,在一个典型的业务系统中,我们可能需要频繁地与数据库进行交互,执行增删改查等操作。如果每次操作都手动编写 SQL 语句,不仅效率低下,而且容易出错。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 1101

MyBatis 源码分析 - 映射文件解析过程

文章目录1.简介2.映射文件解析过程分析2.1 解析映射文件2.1.1 解析 `` 节点2.1.2 解析 `` 节点2.1.3 解析` ` 节点2.1.3.1 解析 `` 和` ` 节点2.1.3.2 解析` 1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程。由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因。所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来,独立成文,于是就有了本篇文章。在本篇文章中,我将分析映射文件中出现的一些及节点,比如<cache

ThinkWon的博客 3921

Mybatis源码学习(六):Mapper接口“实例化”

Mybatis 是如何“实例化”Mapper接口的

仔哥学编程 3398
上一篇: Mybatis 源码学习(一) Mapper 注册
下一篇: Mybatis 源码学习(三) 一级缓存
天天
博客等级 码龄21年 219粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值