Mybatis——2.2 SQL的映射

news2024/10/4 20:14:41

Mybatis——2.2 SQL的映射

  • 1.代理模式
  • 2.如何执行接口方法
    • 示例demo
  • 3.Mybatis是如何做的
    • 3.1猜想
    • 3.2源码探究

“Java中非静态方法的运行需要实例对象才能运行(即对象点方法),Mybatis中的Mapper都是接口,也没有实现类,那么接口中的方法怎么就被调用执行了呢?”

这是当时用Mybatis时最困扰我的一个问题,搜的资料博客中,大多来一句“动态代理”一笔带过。留我一人风中凌乱,难道"动态代理"四个字这么形象生动、易于理解吗…
也因为这个疑问,了解了代理模式,动态代理,以及Mybatis如何使用动态代理完成mapper接口方法的调用。

1.代理模式

这里简单说一下,例子就不举了,网上都是。说一下工作中的使用场景,一般是某个类无法修改或不敢改动,那就在目标类外面包一层代理类,即不用修改目标类,又可以对目标类做功能的增强。其原理就是:通过实现和目标类相同的接口来平替目标类,然后通过构造函数获取目标类的对象引用,增强的功能由代理类完成,核心的逻辑依旧通过目标类进行调用。(我记得好像写过对应的设计模式笔记,感兴趣的可以翻一下)

2.如何执行接口方法

前面提到的代理模式和文章开头的问题有关系吗?当然有关系,如果你理解了什么是代理,文章开头的问题就可以通过代理来实现。
即使接口没有实现类,也可以通过InvocationHandler为其创建代理类,通过代理类执行接口方法。这是java反射包下的一个接口,可以为接口生成代理对象。简单代码示例:

示例demo

// 定义接口
public interface Interface01 {
    String m1();
    int m2();
}
// 定义调用处理器
public class Interface01Handler implements InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(method.getName().equals("m1")) {
            return "hello world";
        }
        else  {
            return 1024;
        }
    }
}
// 创建代理对象测试
public static void main(String[] args) {
	// 代理对象
    Object proxy = Proxy.newProxyInstance(Interface01.class.getClassLoader(),
            new Class[]{Interface01.class}, new Interface01Handler());

    if(proxy instanceof Interface01) {
        // 调用接口方法
        Interface01 a = (Interface01) proxy;
        System.out.println(a.m1());
        System.out.println(a.m2());
    }
}

上述代码中,接口并没有实现类,但接口方法可以被调用。当然你也可以理解成:接口是以另一种形式被实现,接口方法以另一种形式被定义。

3.Mybatis是如何做的

通过反射可以为接口创建代理对象。知道了Java中的这个机制后,回到Mybatis的疑问,mapper也是接口,也没有实现类但最终其方法可以被调用,类比一下,你应该可以猜到Mybatis是如何来实现的。

3.1猜想

我们猜想Mybatis是使用了Java的反射和代理,方法执行是由InvocationHandler实现类的invoke()方法来完成。有以下几点疑问:

  1. 在demo中,接口的方法逻辑是在InvocationHandler的实现类中写死的,即 invoke的逻辑。如果Mybatis是按照示例代码的逻辑去实现的,调用处理器的逻辑在什么地方?Mybatis中我们没有编写调用处理器的逻辑。
  2. 回想一下InvocationHandler的invoke()方法,它其实就是执行接口中某个方法的逻辑。而mapper.xml中定义的SQL片段恰恰就是方法的执行逻辑。
  3. 于是我们猜想,Mybatis确实是使用示例代码相同的模式来创建代理对象,但代理对象的调用处理器的执行逻辑则是使用mapper.xml文件来完成。
    那么mapper.xml中的方法如何与代理对象中的invoke()方法进行映射和绑定呢?当我们调用mapper接口的某个方法时,调用处理器如何自动执行mapper.xml中同名的SQL呢?这一步如果通了,Mybatis中SQL映射的核心也就知道的差不多了

3.2源码探究

(未完待)

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

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

相关文章

SpringBoot3+Vue3开发后台管理系统脚手架

后台管理系统脚手架 介绍 在快速迭代的软件开发世界里,时间就是生产力,效率决定成败。对于构建复杂而庞大的后台系统而言,一个高效、可定制的后台脚手架(Backend Scaffold)无疑是开发者的得力助手。 脚手架 后台脚…

CSS计数器

CSS 中的计数器类似于变量,可以实现简单的计数功能,并将结果显示在页面上,在早期的网站上应用比较广泛。要实现计数器需要用到以下几个属性: counter-reset:创建或者重置计数器;counter-increment&#xf…

day04笔试练习

1.Fibonacci数列 题目链接:Fibonacci数列_牛客题霸_牛客网 题目思路: 定义 a b c 三个变量 使 c 一直加到比 n 大的最近的斐波那契数 此时比较 c 和 b 哪个数离得最近就好 public static void main(String[] args) {Scanner sc new Scanner(System.in…

选择网络安全模式启动Windows系统,解决PC无法连接网络问题

目录 1、电脑无法连接网络 2、发现C:\Windows\System32\drivers路径下的很多文件不见了 3、使用360安全卫士中的断网急救箱工具修复,也就解决不了问题 4、重启系统,以网络安全模式启动系统,修复系统网络模块,完美解决问题 5、…

《计算机原理与系统结构》学习系列——计算机的算数运算(上)

系列文章目录 目录 ALU行波进位加法器超前进位加法器整数运算加减法乘法无符号数相乘N位乘法数的工作流程N位乘法器改进:硬件资源更快速的乘法 MIPS中的乘法除法 32位除法器流程除法器改进 更快速的除法 MIPS中的除法总结 ALU ALU功能:对a,…

9-贪心算法

参考:代码随想录 题目分类大纲如下: 贪心算法理论基础 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心的套路(什么时候用贪心) 贪心算法并没有固定的套路,说白了…

huggingface 数据/模型下载

使用huggingface CLI下载数据、模型 1. 介绍2. 使用1)下载、安装2)设置环境变量3)登录 Hugging Face 帐户4)模型下载 3. 附:使用 git 下载方法 1. 介绍 huggingface_hub Python包附带了一个名为huggingface CLI的内置…

界星空科技漆包线行业称重系统

万界星空科技为漆包线行业提供的称重系统是其MES制造执行系统解决方案中的一个重要组成部分。以下是对该系统的详细介绍: 一、系统概述 万界星空科技漆包线行业称重系统,是集成在MES系统中的一个功能模块,专门用于漆包线生产过程中的重量检…

《Linux从小白到高手》理论篇:Linux的时间管理运行级别启动过程原理详解

List item 本篇将介绍Linux的时间管理&运行级别相关知识,并将深入介绍Linux的启动过程及原理。 Linux的时间管理 Linux 时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称 RTC)时钟。系统时…

THREE.JS Blinn–Phong反射模型 高光shader

文章目录 参考效果核心全部代码更新: 多点光(使用结构体)TODO: 新增灯光更新着色器 (threejs也是这么做的 所以动态灯光开销颇大(动态visible不需要重新构建着色器)) 参考 Blinn–Phong reflection model 效果 平滑着色平直着色…

无IDEA不Java:快速掌握Java集成开发环境

IntelliJ IDEA是一种强大的Java集成开发环境,是Java开发人员的首选工具之一。本文将介绍IDEA的基本使用方法和常用功能,以帮助初学者快速上手。 安装和配置 首先,需要下载并安装IntelliJ IDEA。在安装完成后,需要配置JDK&#xff…

OpenAI 再现变革风暴!-- 高管离职潮与营利化转型背后的深层次变动

OpenAI 正处于历史的转折点。作为全球最知名的 AI 公司之一,OpenAI 一直以来以其领先的人工智能技术和开放的研发精神吸引了大量的关注与支持。然而,近期的一系列高管离职以及转型为营利性公司的计划,引发了外界的广泛讨论。本文将深入探讨这…

使用Java调用GeoTools实现全球国家矢量数据入库实战

目录 前言 一、相关数据介绍 1、无空间参考的数据 2、有空间参考的数据 3、空间信息表物理模型 二、全球国家空间数据入库 1、后台实体类图 2、后台实体对象关键代码 三、时空数据入库实践 1、读取无空间参考数据 2、入库成果及注意事项 四、总结 前言 在当今世界&…

【LuBase低代码框架】动态数据源服务介绍

功能介绍: 可以通过配置一个QueryOption对象或者一条select 查询语句,返回当前应用下的数据,避免后端写代码开发。 使用方法: 1. 动态服务需要通过/invoke/datasource和/invoke/datasourceNoRight 地址发起调用 2. 可使用参数…

Gaussian-splatting 项目环境配置笔记(Win11)

如果你是配置别的项目的过程中用到了3D GS相关的内容,然后这部分内容环境一直配不好,也可以跟随这个博客配一下环境,配完后起码3D GS部分就搞定了。 文章目录 概述项目链接:VS2019直接下载链接CUDA不同版本下载链接安装Condasetup…

Java开发每日一课:21世纪最流行的语言,Java为什么这么火?

自从进入21世纪以来,Java在TIOBE语言排行榜一直稳居前2名,占有率一直在12%以上。从国内各大招聘网站的岗位需求和培训班的畅销课程上看,Java一直稳居榜首,可以说Java是21世纪最流行的语言。 作为一个1995年才推出的语言&#xff0…

JVM(HotSpot):字符串常量池(StringTable)

文章目录 一、内存结构图二、案例讲解三、总结 一、内存结构图 JDK1.6 JDK1.8 我们发现,StringTable移入了Heap里面。所以,应该想到,StringTable将受到GC管理。 其实,1.6中,在方法区中的时候,也是受GC管…

01 排列选票

题目&#xff1a; 桶排序&#xff1a; #include<bits/stdc.h> using namespace std; #define M 100005 int a[M];int main() {int n,m;cin>>n>>m;for(int i1;i<m;i){int temp;cin>>temp;a[temp];}for(int i1;i<n;i){for(int j1;j<a[i];j){co…

OpenVINO基本操作流程

环境配置&#xff1a; conda env list:可以查看有哪些环境 conda activate intel:启动某个环境 pip list&#xff1a;可以查看此环境下都下载了哪些软件包 from openvino.inference_engine import IEcore#从OpenVINO推理引擎中导入IECore类 import numpy as np import cv2 1&…

基于GitLab 的持续集成环境

一.技术基础 Gitlab: 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务 GitRunner:用于运行您的作业并将结果发送回GitLab。它与GitLab CI一起使用&#xff0c;GitLab CI是GitLab随附的开源持续集成服务&…