首页 > 其他分享 >Mybatis的接口映射原理

Mybatis的接口映射原理

时间:2024-03-26 15:55:50浏览次数:23  
标签:Mapper getMapper 调用 映射 接口 BlogMapper Mybatis 方法

1、问题引入
在使用 Mybaits时 ,只需要写一个Mapper 接口(不用写实现类),并在对应的xml 文件中写好 sql 。然后,Mybatis就自动实现了具体的 CRUD 方法调用。

通常我们使用 Mybatis 的主要步骤是:

构建 SqlSessionFactory ( 通过 xml 配置文件 , 或者直接编写Java代码)
从 SqlSessionFactory 中获取sqlSession
从sqlSession 中获取Mapper,例如BlogMapper
调用 Mapper 的方法 ,例如:blogMapper.selectBlog(int blogId)

由此可知,session.getMapper() 方法内部产生了BlogMapper接口的实现类,因为BlogMapper是接口。

2、接口映射原理
(1)当解析xml配置文件时,会根据<mapper namespace="....">的namespace属性值,判断classpath下有没有这样一个接口的全路径与namespace属性值完全相同,如果有,则建立二者之间的映射关系。

进入XMLMapperBuilder类中,找到bindMapperForNamespace。

(2)进入Configuration类,找到addMapper方法,再进入MapperRegistry类, BlogMapper接口其实是注册在MapperRegistry类中的。

Configuration类实际上将addMapper和getMapper委派给了MapperRegistry来执行:

addMapper方法会针对这个Mapper接口生成一个MapperProxyFactory工厂类。
getMapper方法,会通MapperProxyFactory工厂类,返回一个Mapper接口的动态代理类。

由图可知,Mapper接口其实是放到HashMap中,其Key 为当前Class对象,value 为一个MapperProxyFactory 实例。

(3)回过头来看上一节的session.getMapper() 的原理。SqlSession 接口有两个实现类,一个是DefaultSqlSession,另一个是SqlSessionManager。由于在初始化SqlSessionFactory时所调用的SqlSessionFactoryBuilder的build()方法里配置的是DefaultSqlSession,所以进一步进入到DefaultSession类中,看看session.getMapper()是怎么实现的。继续进入getMapper方法中,发现是调用的mapperRegistry的getMapper方法。

综上可知,sqlSession.getMapper(BlogMapper.class)方法先是调用了 configuration的getMapper方法,最终是调用了MapperRegistry的getMapper方法。以BlogMapper的class对象为key,找到了对应的value,也就是mapperProxyFactory对象,然后调用这个对象的newInstance()方法。

(4)进入MapperProxyFactory中,发现是通过Proxy.newProxyInstance方法产生了一个BlogMapper的代理对象,也就是jdk的动态代理。其中三个参数分别为:

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

(5)进入代理类MapperProxy中,找到execute方法,该方法中封装了CRUD。

总结:
当调用sqlSession.getMapper()方法时,就会创建一个新的动态代理对象。

首先,Mybatis会调用XMLMapperBuilder类的bindMapperForNamespace()方法,根据xml文件中的namespace中的属性,去找Mapper接口,如果找到,就通过configuration类(然后是MapperRegistry 类)的addMapper()方法将其注册到MapperRegistry 类的 HashMap中,key是Mapper接口的class对象,value是当前的Mapper的代理工厂对象mapperProxyFactory,然后调用该对象的newInstance()方法去实例化对象,newInstance()里面返回的就是基于jdk的动态代理生成的Mapper接口的代理对象,在代理类MapperProxy 中完成了CRUD的调用。
————————————————

原文链接:https://blog.csdn.net/qq_42098875/article/details/118967624

标签:Mapper,getMapper,调用,映射,接口,BlogMapper,Mybatis,方法
From: https://www.cnblogs.com/forestwolf/p/18096876

相关文章

  • SpringBoot手动取消接口执行方案
    实际开发中经常会遇到比较耗时的接口操作,但页面强制刷新或主动取消接口调用后后台还是会继续运行,特别是有大量数据库操作时会增加服务器压力,所以进行研究测试后总结了一套主动取消接口调用的解决方案自定义注解用于标记耗时接口@Retention(RetentionPolicy.RUNTIME)@Target({El......
  • ISBN信息查询api接口
     基本说明:接口地址:http://data.isbn.work/openApi/getInfoByIsbn?isbn={isbn}&appKey={appkey}返回格式:json请求方式:get请求示例:http://data.isbn.work/openApi/getInfoByIsbn?isbn=9787513159074&appKey=ae1718d4587744b0b79f940fbef69e77伽薇 809137232请求参数说明:名......
  • 接口注意的点
    参考:http://mp.weixin.qq.com/s?__biz=Mzk0ODYyNjE4NA==&mid=2247486325&idx=1&sn=eadb10489f62167bb628f3f89828c613&chksm=c365fd12f4127404b3351138ddfd38934644046777942dccd4d3742de7e2d0198214fa364df8&mpshare=1&scene=24&srcid=03262a33of......
  • 分析回调接口的记录
    分析回调接口的一个重要指标就是:方向性。WhycanextendsainterfacegetacallbackinJava?BurpSuite提供了一个标准的API接口,插件开发者需要实现其中的某些接口和方法,并通过BurpSuite提供的扩展性框架注册和加载插件。BurpSuite在运行时会自动发现并调用插件中实现的特......
  • mybatis plus 添加分页插件
    一、后端配置支持分页控件1、在pom.xml添加上依赖<!--Mybatis-Plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2......
  • JAVA接口详解
    一,抽象类抽象类为用abstract修饰的类1,定义的成员变量与普通的类没有区别2,抽象类不可以被实例化3,当一个类不具体描述某个对象时,可以定义为抽象类4,如果一个类包含抽象方法,则这个类必须是抽象类,没有抽象方法,也可以被称为抽象类5,一个方法可以被修饰为abstract,这个方法可以不......
  • 淘宝item_sku-获取sku详细信息AIP接口(taobao.item_sku)布局技巧:3个技巧教你凸显商品sku
    淘宝的taobao.item_sku API接口是用于获取淘宝商品中SKU(StockKeepingUnit,库存量单位)的详细信息的。SKU通常代表一个商品的不同属性组合,比如颜色、尺码等。对于商家和消费者来说,了解SKU的详细信息是非常重要的,因为它可以帮助他们更准确地了解商品的具体属性和库存情况。通......
  • Springboot3基于SpringDoc实现接口分组功能
    问题最近在接触SpringBoot3,整合Swagger文档组件的过程中发现一个问题,通过springdoc.group-configs[0].display-name=示例接口配置分组名称在界面上面还是显示OpenAPIdefinition,如下图所示:查询了下官方文档,可以通过注入GroupedOpenApi对象实现接口分组描述信息展示,同时找到了一......
  • [附源码]计算机毕业设计高校教材管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着高校教育资源的不断扩充和教育体系的日益复杂化,高效的教材管理变得尤为重要。一个专业的高校教材管理系统能够实现教材信息的集中管理、库存状态实时监控、......
  • [附源码]计算机毕业设计大学生创新项目管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着高等教育的不断发展,大学生创新项目成为培养学生创新能力和实践能力的重要途径。有效的项目管理对于确保创新项目的顺利进行和高质量完成至关重要。然而,目前......