MyBatis 源码分析-- getMapper(获取Mapper)

前言:

前面我们从源码层面梳理了 SqlSessionFactory、SqlSession 的创建过程,本篇我们继续分析一下 Mapper 的的获取过程。

初识 MyBatis 【MyBatis 核心概念】

MyBatis 源码分析–SqlSessionFactory

MyBatis 源码分析–获取SqlSession

案例代码:

public class MyBatisTest {@Testpublic void test() throws IOException {//读取配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//创建 SqlSessionFactoryBuilder 对象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//通过 SqlSessionBuilder 对象 解析 mybatis-config.xml 文件 构建一个SqlSessionFactory SqlSessionFactory sqlSessionFactory = builder.build(is);//通过SqlSessionFactory构建一个SqlSessionSqlSession session = sqlSessionFactory.openSession();//通过SqlSession 获取 Mapper 实例UserMapper userMapper = session.getMapper(UserMapper.class);//获取数据List<User> users = userMapper.findAll();//打印输出for (User user : users) {System.out.println(user);}//关闭资源session.close();is.close();}
}

本篇我们将主要对 session.getMapper(UserMapper.class); 这句代码进行分析。

DefaultSqlSession#getMapper 源码分析

//org.apache.ibatis.session.defaults.DefaultSqlSession#getMapper
public <T> T getMapper(Class<T> type) {return this.configuration.getMapper(type, this);
}//org.apache.ibatis.session.Configuration#getMapper
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {return this.mapperRegistry.getMapper(type, sqlSession);
}

MapperRegistry#getMapper 源码分析

//org.apache.ibatis.binding.MapperRegistry#getMapper
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {//根据 class 获取 Mapper 代理工厂MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory)this.knownMappers.get(type);if (mapperProxyFactory == null) {throw new BindingException("Type " + type + " is not known to the MapperRegistry.");} else {try {//使用 Mapper 代理工厂创建 Mapper 代理对象返回return mapperProxyFactory.newInstance(sqlSession);} catch (Exception var5) {throw new BindingException("Error getting mapper instance. Cause: " + var5, var5);}}
}//org.apache.ibatis.binding.MapperProxyFactory#newInstance(org.apache.ibatis.session.SqlSession)
public T newInstance(SqlSession sqlSession) {//Mapper 代理MapperProxy<T> mapperProxy = new MapperProxy(sqlSession, this.mapperInterface, this.methodCache);//创建 Mapper 代理对象return this.newInstance(mapperProxy);
}//org.apache.ibatis.binding.MapperProxyFactory#newInstance(org.apache.ibatis.binding.MapperProxy<T>)
protected T newInstance(MapperProxy<T> mapperProxy) {//使用 JDK 创建一个 Mapper 的代理对象return Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);
}

从源码可以看出,获取 Mapper 其实就是根据 Mapper 的 Class 类型从 MapperRegistry 中获取一个 MapperProxyFactory,最终调用 MapperProxyFactory.newInstance 方法创建一个代理对象,生成一个代理类来调用 Mapper 的方法,这里的 MapperProxyFactory 其实就是在获取 SqlSessionFactory 中存入 MapperRegistry 的 MapperProxyFactory。

欢迎提出建议及对错误的地方指出纠正。

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

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

相关文章

【arm扩容】新硬盘挂载操作说明

背景&#xff1a; 未经过扩容的arm设备不满足移植大镜像的条件。 需求&#xff1a; 我们要对arm设备扩容&#xff0c;现在要将一个500G的硬盘挂进去。而且要按照老arm设备的挂法&#xff0c;保持相同的目录结构。配置这台机器。 下面老arm设备的硬盘挂载相关信息。 lsblk …

【已解决】如何为qt表格设置复选框单击事件

本博文源于笔者正在处理的表格复选框的事件&#xff0c;这里遇到的问题是&#xff1a;想要为qt表格中每一行复选框设置单击事件&#xff0c;一开始不知道如何处理&#xff0c;后面研究学习了一下&#xff0c;故记录此博文。 问题原因 想要为qt表格中每一行复选框设置单击事件…

SSRF(2)

Gopher协议的利用 gopher协议是ssrf利用中最强大的协议 gopher协议支持发出GET、POST请求&#xff1a; 可以先截获get请求包和post请求包&#xff0c;再构成符合gopher协议的请求。 默认端口为70,一般需发送到80端口 如果发起post请求&#xff0c;回车换行需要使用%0D%0A&…

Java编程小练习题目

题目&#xff1a; 你和相亲对象正在餐厅里约会。键盘录入两个整数&#xff0c;用来分别表示你和对象的衣服的时髦度。&#xff08;手动录入0-10之间的整数&#xff0c;不能录入其他的&#xff09;。如果你的时髦度大于你对象的时髦度&#xff0c;相亲就成功&#xff0c;打印输出…

消息队列-概述-JMS和AMQP

JMS和AMQP JMS是什么 JMS&#xff08;JAVA Message Service,java 消息服务&#xff09;是 Java 的消息服务&#xff0c;JMS 的客户端之间可以通过 JMS 服务进行异步的消息传输。JMS&#xff08;JAVA Message Service&#xff0c;Java 消息服务&#xff09;API 是一个消息服务…

1950 Springboot汽修技能点评系统idea开发mysql数据库APP应用java编程计算机网页源码maven项目

一、源码特点 springboot 汽修技能点评系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

N32G031 I2C使用说明

目录 功能说明 使用指导 应用场景 总结 N32G031微控制器的I2C&#xff08;Inter-Integrated Circuit&#xff09;输出功能是一个重要的数字通信接口&#xff0c;用于与其他设备进行数据交换。以下是关于N32G031 I2C输出功能的完整说明和使用指导&#xff1a; 功能说明 接…

CGFloat转NSString保持原有的精度,末尾不添加0

问题阐述&#xff1a; 我们进行CGFloat转NSString可能会遇到一个问题 例如有一个CGFloat的值为2.1&#xff0c;转化成NSString后显示2.1000... 解决办法&#xff1a; 方法一&#xff1a; 如何解决呢&#xff0c;可以使用%g格式符&#xff0c;可以保证传入的不管是2还是2.1…

了解预防中间人攻击

什么是中间人&#xff08;MITM&#xff09;攻击&#xff1f; 中间人&#xff08;MITM&#xff09;攻击是一种网络安全威胁&#xff0c;其中攻击者设法在两个通信实体之间插入自己&#xff0c;从而能够拦截、篡改或转发这两个实体之间的通信。由于攻击者能够同时与双方进行通信…

提高开关电源效率一般做法

提高开关电源效率一般做法 开关电源的功耗包括由半导体开关、磁性元件和布线等的寄生电阻所产生的固定损耗以及进行开关操作时的开关损耗。对于固定损耗,由于它主要取决于元件自身的特性,因此需要通过元件技术的改进来予以抑制。在磁性元件方面,对于兼顾了集肤效应和…

第12天:前端集成与交互

第12天&#xff1a;前端集成与交互 目标 将前端框架与Django后端集成&#xff0c;实现前后端分离。 任务概览 选择一个前端框架并创建基础页面。使用AJAX或Fetch API与后端API交互。 详细步骤 1. 选择前端框架 选择一个适合项目的前端框架&#xff0c;如React、Vue.js或…

Google Adsense----Wordpress插入谷歌广告

1.搭建个人博客,绑定谷歌search consol,注册adsense 详细可以参考这个视频b站视频 2.将个人博客网站关联到Adsense 在adsense里新加网站,输入你的博客网址,双击网站 将这段代码复制到header.php的里面 在wordpress仪表盘的外观-主题文件编辑器,找到header.php将代码复制,…

如何在 Ubuntu 14.04 上使用 Iptables 实现基本防火墙模板

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 实施防火墙是保护服务器的重要步骤。其中很大一部分是决定强制执行对网络流量的限制的个别规则和策略。像 iptables 这样的防火墙…

HTTP/2 的 ALPN(应用层协议协商)

文章目录 HTTP/2 的 ALPN&#xff08;应用层协议协商&#xff09;详解什么是 ALPN&#xff1f;ALPN 的工作原理为什么使用 ALPN&#xff1f;ALPN 的优势示例 HTTP/2 的 ALPN&#xff08;应用层协议协商&#xff09;详解 什么是 ALPN&#xff1f; ALPN&#xff08;Application…

全网最全!25届最近5年上海理工大学自动化考研院校分析

上海理工大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、历年真题PDF 七、初试大纲复试大纲 八、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试…

获取时间戳是使用System.currentTimeMillis()还是使用new Date().getTime()(阿里开发规范)?

1.阿里规范 在阿里的Java开发手册中强制要求使用System.currentTimeMillis() 2.为什么(源码详解) new Date().getTime()它实际上也是调用的System.currentTimeMillis()&#xff0c;源码分析。 这个fastTime是它的成员变量&#xff0c;在new Date()的时候就被赋值了。 扩展一…

CentOS 7 安装部署Cassandra4.1.5

一、Cassandra的介绍 Cassandra是一套开源分布式NoSQL数据库系统。它最初由Facebook开发&#xff0c;用于储存收件箱等简单格式数据&#xff0c;集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源&#xff0c;此后&#xff0…

算法设计与分析:分治法求最近点对问题

目录 一、实验目的 二、实验内容 三、算法思想 四、实验步骤 1、蛮力法 2、分治法 2.1 先用快速排序SortX(A,1,n)将所有点按x坐标升序排序 2.2 点数n<3时直接计算&#xff0c;时间复杂度为O(1) 2.3 点数n>3时 五、实验结果和分析 一、实验目的 1. 掌握分治法思…

ArkUI部分案例笔记——padding,space

基础的构建 组件分类&#xff1a; 容器组件&#xff1a;像Column&#xff0c;Row这种组件就是容器组件一般就来控制行和列的就是容器组件 基础组件&#xff1a;Text(文本组件)&#xff0c;像这种用来有一定功能的就是基础组件 注意&#xff1a;一个build只能有一个根容器组件…

TreeMap源码剖析:自定义排序规则的红黑树map数据结构

文章目录 概述基本结构构造函数自定义排序实现维护红黑树性质小结 概述 Java中的TreeMap类实现了自定义排序规则的红黑树&#xff08;Red-Black Tree&#xff09;Map数据结构&#xff0c;它保证了键值对按照键的自然顺序或提供的比较器&#xff08;Comparator&#xff09;进行…