Mybatis Mapper接口如何找到实现类

Mybatis Mapper接口是如何找到实现类的-源码分析 转载自:https://www.cnblogs.com/demingblog/p/9544774.html KeyWords: Mybatis 原理,源码,Mybatis Mapper 接口实现类,代理模式,动态代理,Java动态理,Proxy.newProxyInstance,Mapper 映射,Mapper 实现 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及... 阅读详情

1、前言

       MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。我们在使用 Mybaits 进行开发 ,通常只需要定义几个 Mapper 接口,然后在编写一个 xml 文件,我们在配置文件中写好 sql , Mybatis 帮我们完成 Mapper 接口到具体实现的调用。以及将结果映射到 model bean 中。
       但是,对于 Mapper 接口,我们并没有编写其实现类!Mybatis是如何找到其实现类,进而完成具体的 CRUD 方法调用的呢?原理何在?

通常我们使用 Mybatis (Mybatis 单独使用,而不是整合 spring )的主要步骤是:

  • 构建 SqlSessionFactory ( 通过 xml 配置文件 , 或者直接编写Java代码)
  • 从 SqlSessionFactory 中获取 SqlSession
  • 从 SqlSession 中获取 Mapper
  • 调用 Mapper的方法 ,例如:userMapper.selectUser(int userId);

2、Mapper 接口是怎么找到实现类的

   2.1、Mapper 接口注册

       诸如UserMapper之类的Mapper接口被添加到了MapperRegistry 中的一个HashMap中。并以 Mapper 接口的 Class 对象作为 Key , 以一个携带Mapper接口作为属性的MapperProxyFactory 实例作为value 。

   2.2、生成Mapper接口的动态代理类

      最终是通过Proxy.newProxyInstance产生了一个UserMapper的代理对象。Mybatis 为了完成 Mapper 接口的实现,运用了代理模式。具体是使用了JDK动态代理,这个Proxy.newProxyInstance方法生成代理类的三个要素是:

  • ClassLoader —— 指定当前接口的加载器即可
  • 当前被代理的接口是什么 —— 这里就是 BlogMapper
  • 代理类是什么 —— 这里就是 MapperProxy

代理模式中,代理类(MapperProxy)中才真正的完成了方法调用的逻辑。
MapperProxy的代码如下:

public class MapperProxy<T> implements InvocationHandler, Serializable {
        // 实现了InvocationHandler
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //代理以后,所有Mapper的方法调用时,都会调用这个invoke方法

            if (Object.class.equals(method.getDeclaringClass())) {
                try {
                    return method.invoke(this, args); 
                } catch (Throwable t) {
                    throw ExceptionUtil.unwrapThrowable(t);
                }
            }
            // 使用了缓存
            final MapperMethod mapperMethod = cachedMapperMethod(method); 
            //执行CURD
            return mapperMethod.execute(sqlSession, args); 
        }
    }

再往下一层,就是执行JDBC那一套了,获取链接,执行,得到ResultSet,解析ResultSet映射成JavaBean。

3、总结

Mapper接口是如何产生动态代理对象的,Maper接口方法最终是如何执行的。总结起来主要就是这几个点:

  • Mapper 接口在初始SqlSessionFactory 注册的。
  • Mapper 接口注册在了名为 MapperRegistry 类的 HashMap中, key = Mapper class对象; value = 创建当前Mapper的工厂。
  • Mapper 注册之后,可以从SqlSession中get
  • SqlSession.getMapper 运用了 JDK动态代理,产生了目标Mapper接口的代理对象。
  • 动态代理的 代理类是 MapperProxy ,这里边最终完成了增删改查方法的调用。
为啥mybatis的mapper只有接口没有实现类,但它却能工作?(全网独一份 接口测试 接口我们就用UserMapper,我们来写个代理对象。 ok,一个简单的动态代理例子送给你们,上面代码中关键生成动态代理对象的关键代码是: loader: 用哪个类加载器去加载代理对象 interfaces:动态代理类需要实现的接口 h:动态代理方法在执行时,会调用h里面的invoke方法去执行 源码分析 好啦,上面该做的准备已经都准备好了,我们对mybatis的这个mapper接口大概都有些思路了,下面我们去正式验证一下,那么肯定就要去看源码了。我们只是去验证上面. 阅读详情

相关推荐

数字IC设计(8)之AHB-Lite总线(持续更新)

AHB总线全称Advanced High-performance Bus,意为先进高性能总线。推出该总线的目的是补充APB总线在性能上的不足,APB总线适合挂载低速外设,所以AHB总线用来挂载高性能的外设,这样子可以分工合作,节约资源。AHB总线可以实现多主多从的连接,此时需要设计仲裁机和matrix(矩阵),AHB-Lite一般用于一主多从,此时则不需要仲裁机和matrix,但是也可以用AHB-Lite来实现多主多从,就是设计多个layer,每个layer是一主多从,再把各个layer连起来;

qq_69440734的博客 2255

MyBatis-plus的实现

1、引入依赖 <dependencies> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.22</version&

qq_44116526的博客 1519

基于ESP32-C3的物联网硬件设计:从免费工具链到PCB打样全流程实战

在物联网和嵌入式开发领域,硬件设计是连接软件逻辑与物理世界的关键环节。其核心原理在于通过电路设计将微控制器、传感器、通信模块等电子元件有机整合,实现特定功能。掌握硬件设计能力的技术价值在于能够自主实现产品原型,优化成本与性能,并深入理解系统底层运作。常见的应用场景包括智能家居节点、环境监测设备、工业传感终端等。本文以热门的ESP32-C3 RISC-V物联网芯片和广泛使用的KiCad免费EDA工具为例,详细解析了从核心器件选型、射频电路布局、PCB设计规则到Gerber文件生产的完整流程,并分享了在嘉立创平

weixin_30918633的博客 333

mybatisPlus在SpringBoot中mapper接口代理类的创建过程分析

这里写自定义目录标题 前言:在spring boot框架中,mybatisplus是怎么生成mapper接口代理类的? 猜测:通过jdk动态代理生成这个接口的实体类,然后… 在spring boot中,我们引入mybatisplus的依赖后,猜测是有自动配置的,我们在第三方包中找,找到如下显示: 我们找到mybatisPlus依赖包中的spring.factories目录,里面显示的就是配置类了。我们顺着这个配置类往下顺。 MybatisPlusAutoConfiguration类,这个类是我们讨论的入口

cheng的博客 4138

高分7(GF7)卫星数据制作平原地区DSM/DEM(三)——可信度分割

李国春(接上)

副组长的博客 1714

centos7 python3.12.1 报错 No module named _ssl,坑我几个小时

网上的教程很多,但几乎是无效的,跟着我这教程,可以完美解决。

Amio_的博客 1万+

02.MyBatis 源码分析之获取实现类

1. Test 2. DefaultSqlSession org.apache.ibatis.session.defaults.DefaultSqlSession 3. Configuration org.apache.ibatis.session.Configuration 4. MapperRegistry org.apache.ibati...

masteryourself 384

【实战指南】从零构建UNet多分类分割数据集:标注、转换与训练全流程

本文提供了一份从零构建UNet多分类分割数据集的完整实战指南。详细介绍了使用Labelme进行图像标注的核心技巧与规范,并通过Python脚本将标注结果转换为模型可用的VOC格式。最后,指导如何修改经典的PyTorch版UNet代码,以适配自定义数据集并进行训练与测试,帮助读者完成从数据准备到模型训练的全流程。

arduino9maker的博客 287

Mybatis Mapper接口实现类的源码分析

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。我们在使用 Mybaits 进行 ,通常只需要定义几个 Mapper 接口,然后在编写一个 xml 文件,我们在配置文件中写好 sql , Mybatis 帮我们完成 Mapper 接口道具体实现的调用。以及将结果映射到 mode...

bug_remover的博客 598

安时积分法和开路电压法结合估算锂电池SOC

基于安时积分法和开路电压法结合的锂电池SOC估计Simulink仿真建模,利用安时积分法计算放电过程中的SOC,在搁置状态利用开路电压法进行SOC修正。

qq_39304296的博客 2554

Token 费用爆炸?教你用 Semantic Cache(语义缓存)把 API 成本降低 80%

本文介绍了语义缓存(Semantic Cache)技术在大模型应用中的关键作用。传统Redis缓存基于精确匹配,无法处理用户提问的语义相似性,导致重复调用昂贵的LLM API。语义缓存通过将问题向量化并在向量空间中进行相似度匹配,可识别30%-50%的重复提问,直接返回历史答案。文章详细解析了技术原理(Embedding+向量搜索)、架构设计,并提供了基于Python和ChromaDB的50行核心实现代码。同时指出了生产环境中的三大挑战:阈值设定、隐私保护和多轮对话处理,并给出相应解决方案。该技术能以极低成

BUG猿的博客 1056

⛳ MyBatis 中 Mapper 接口工作原理实例解析

上面我们用层层深入的方式摸清楚了 Mapper接口是如何找到实现类的。我们分析了 Mapper接口是如何注册的,Mapper接口是如何产生动态代理对象的,Maper接口方法最终是如何执行的。总结起来主要就是这几个点:Mapper 接口在初始SqlSessionFactory 注册的。Mapper 接口注册在了名为 MapperRegistry 类的 HashMap中, key = Mapper class value = 创建当前Mapper的工厂。

松柏123的博客 2176

chembl_webresource_client 包数据接口下载chembl数据库;ZINC数据库下载、simles获取

点击进去https://zinc.docking.org/subclasses/kinase/predictions/,然后下载sdf模式,这里可以转化simles格式,如果下载csv里面没有包含simles。参考:https://github.com/chembl/chembl_webresource_client/blob/master/demo_wrc.ipynb。参考:https://zinc.docking.org/这是网页搜索查看,16条数据。这个数据这下载特别慢。

weixin_42357472的博客 3051

MyBatis中动态创建DAO接口实现类的字节码文件

噢啦啦啦啦

tty1122334的博客 332

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

mybatis如何根据mapper接口生成其实现类

SpringBoot集成mybatis mybatis的statement的解析与加载 mybatis如何根据mapper接口生成其实现类 mybatis的mapper返回map结果集 mybatis结果的组装 序 mybatis里头给sqlSession指定执行哪条sql的时候,有两种方式,一种是写mapper的xml的namespace+statementId,如下:...

u014712365的博客 79

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Mybatis源码分析 8】mybatis的mapper接口中dao方法并没有具体实现类,是怎么通过mapper动态代理运行的

准备工作 1. 定义UserDAO接口,提供一个SelectByName抽象方法 package DAO; import Entity.User; import org.apache.ibatis.annotations.*; @Mapper public interface UserDAO { @Select("select * from manage where name = #{name}") List<User> selectByName(String nam

Elevenoo的博客 696

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

为啥mybatis的mapper只有接口没有实现类,但它却能工作?

说起mybatis,大伙应该都用过,有些人甚至底层源码都看过了。在mybatis中,mapper接口是没有实现类的,取而代之的是一个xml文件。也就是说我们调用mapper接口,其实是使用了mapper.xml中定义sql完成数据操作。 大家有没想过,为什么mapper没有实现类,它是如何和xml关联起来的? 一个简单的例子 ok,别急,现在我们已经抛出问题,现在我们从demo...

凡是过往,皆为序章 8905

mybatis的mapper为啥只有接口没有实现类,它却能工作?

这时候,我们发现Configuration里面出现了一个mapperRegistry,翻译过来可以理解为mapper的注册器,其实在加载UserMapper.xml的时候,我们就需要在mapperRegistry里面进行注册,所有,我们可以从这里面进行获取。那么只能是动态代理,动态代理接口的所有方法,每次接口被调用,就会进入动态代理对象的invoke方法,然后加载xml中的sql完成操作数据库,再返回结果。所以,动态代理代理还是对象类,那么我们只有接口,不能new,哪来的对象呢?,就是反射生成的这个对象。

LoveSummer 1万+

Mybatis如何根据mapper接口生成其实现类

目录 一、序 二、问题 2.1 mapper的实现类如何生成 2.2 mybatis-spring帮忙做了什么 三、mapper代理类是如何生成的 四、mybatis-spring帮忙做了什么 4.4 关于MapperFactoryBean 4.5 SqlSessionTemplate 4.6 SqlSessionInterceptor 一、序 mybatis...

老刀 2378

mybatis Mapper接口映射Mapper.xml代码分析

我们在使用mybatis时,会用到Mapper接口映射Mapper.xml,具体怎么映射的我们不知道。只知道要这么用,下面我们开始分析mybatis代码。 在分析具体代码时,我们有必要先看一下jdk动态代理。 简单点说:jdk动态代理,可以让我们在不实现接口的情况下,去动态生成接口的实现。 传统上我们要去实现接口,都会创建具体的实现类.java, 而jdk动态代理,可以让我们不用创建具体的...

baidu_38558076的博客 1万+
上一篇: 海量连接服务端jvm参数调优杂记
下一篇: mybatis多表关联查询及高级映射
zhg_vincent
博客等级 码龄12年 93粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值