mapper注解的主要作用_Mybatis中mapper的xml解析详解

上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder。

基础介绍

回顾下之前是在分析configuration的初始化过程,已经进行到了最后一步mapperElement(root.evalNode("mappers")),这个方法里有两种解析mapper的方法,一种是解析类,一种是解析xml文件,上一篇文章在讲解析类中的注解,今天说到的就是解析xml的流程,关键代码如下:

5290d8ee5fb6f77dc096fe11d9f13c82.png

解析mapper有4种情况可以分成根据类解析和根据xml文件解析两类,这次是后面这类,主体方法还是比较简单。

首先根据inputStream, configuration, resource或url, configuration.getSqlFragments()四个参数初始化一个XMLMapperBuilder;

然后执行XMLMapperBuilder对象的parse方法;

初始化XMLMapperBuilder

初始化过程源码已在上图的右侧部分,初始化XMLMapperBuilder方法的流程与加载mybatis的配置文件关键类XMLConfigBuilder及其相似,都是通过xml文件创建XPathParser对象作为XMLMapperBuilder对象的parse属性。最后执行parse方法去解析xml文件内容。

实际上XMLMapperBuilder与XMLConfigBuilder都继承BaseBuilder类,通过名字也可以看出来他们采用的是构建者模式,在结合他们的使用流程就能够更加理解mybatis采用构建者模式对不同的xml解析过程

在初始化方法中又出现了一个关键类MapperBuilderAssistant,这个在上一篇分析MapperAnnotationBuilder类是发现MapperAnnotationBuilder解析了所有的注解然后把解析的内容给到MapperBuilderAssistant对象,然后通过MapperBuilderAssistant对象生成的对象具体sql的MappedStatement对象。

这里可以大胆猜测XMLMapperBuilder应该也是一样,解析出xml中所有信息然后给到MapperBuilderAssistant去生产MappedStatement对象

XMLMapperBuilder和MapperAnnotationBuilder都是工具人,MapperBuilderAssistant才是真正生成MappedStatement对象的类

parse方法

parse方法比较简单在上图中也已经把源码贴出来了,主要分四步:验证重复加载、加载mapper节点并解析、绑定名称空间、解决未处理的方法。

第一三步比较简单就不在详细说了,而第四步是也就是parse方法最后三行代码,他的主要作用是解决在第二步解析mapper时不能处理的一些数据进行处理,代码比较简单不在详细分析了,源码如下:

8e39ebed9b0b0cc0cf235a845aa0bc47.png

configurationElement方法

可以看出来最最关键的方法还是parse方法的configurationElement方法,他才是真正解析mapper.xml的方法,方法源码如下图:

a0d5ee04500e1cd0407ed81e090fb360.png

方法比较简单,就是读取对应节点的数据,进行解析,重点是调用的这些解析方法,可以看到一些我们平时最常见的比如mapper节点上的namespace属性,还有常见的resultMap节点、sql节点等。

这里我简单点就只看最后一行解析具体的select|insert|update|delete节点的方法,因为他们对应的就是我们具体的sql了。根据上图可以看到获取所有的这类节点,然后遍历生成了一个XMLStatementBuilder的对象并执行parseStatementNode方法。接下来来看XMLStatementBuilder类。

XMLStatementBuilder类

XMLStatementBuilder的源码如下图:

fc4315f32ff5efccd776f12557553bc4.png

XMLStatementBuilder与XMLMapperBuilder一样都是继承BaseBuilder类,它的XNode类型属性context对应mapper文件中一个select、update等节点。初始化方法没什么说的,主要看parseStatementNode方法,上图中已经截图一部分,剩下部分如下图:

d0738d35f9e7917e8ec4a0a3be92b8ce.png

parseStatementNode方法并不复杂,都是在读取context的数据,主要是最后圈出来的代码,和上一篇解析MapperAnnotationBuilder类最后调用的是同一方法。

前面猜错了啊,XMLMapperBuilder连工具人都算不上,XMLStatementBuilder才算生成MappedStatement的工具人。不过仔细一想也是对的,XMLMapperBuilder对应的是一个mapper.xml文件,而要生成的MappedStatement对应的是具体的一条CRUD语句,一个xml是包含多条CRUD语句的。

总结

一个XMLMapperBuilder对应一个mapper.xml文件,而XMLMapperBuilder能够从xml文件中获取多个CRUD语句对应的节点,每个节点对应生成一个XMLStatementBuilder对象,XMLStatementBuilder解析节点中所有信息后与MapperAnnotationBuilder解析出注解中包含的信息一样交给MapperBuilderAssistant去生成一个MappedStatement。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

f6e1b420ca85279ee6c011b28d0d5da2.png

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

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

相关文章

机器学习之梯度下降法(GD)和坐标轴下降法(CD)

梯度下降法 梯度下降法(Gradient Descent, GD)常用于求解无约束情况下凸函数(Convex Function)的极小值,是一种迭代类型的算法,因为凸函数只有一个极值点,故求解出来的极小值点就是函数的最小值…

阿里云Https部署网站

0、开始之前 文章图片很多,注意流量 首先你得准备好一个已经备案成功的域名,并且有一个在阿里云的服务器部署了的网站。 然后就是你迫切的希望升级网站为HTTPS部署。 那么我们开始吧! 1、申请CA证书 1.1登录阿里云控制台,选择菜单…

mysql数据库多实例部署

本文系统:rhel5.8 ip : 192.168.100.150 数据库版本:mysql-5.6.15 1、创建部署mysql服务账号: 1234[rootdaf ~]# useradd -d /opt/mysql mysql [rootdaf ~]# echo "mysql" |passwd --stdin mysql Changing password for user mysq…

Python 第三方模块之 numpy.linalg - 线性代数

目录 numpy.linalg.det() 行列式 numpy.linalg.solve() 方程的解 numpy.linalg.inv() 逆矩阵 np.linalg.eig 特征值和特征向量 np.linalg.svd 奇异值分解 np.linalg.pinv 广义逆矩阵(QR分解) numpy.linalg模块包含线性代数的函数。使用这个模块&am…

rabbitmq direct 多个消费者_一文解析 RabbitMQ 最常用的三大模式

Direct 模式所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue。Direct 模式可以使用 RabbitMQ 自带的 Exchange: default Exchange,所以不需要将 Exchange 进行任何绑定(binding)操作。消息传递时,RouteKey 必须完全匹配才会被队列接…

程序员成长最快的环境

除开五大或者ThoughtWorks这种要什么有什么,进去做打字也能光耀门楣的不谈。如果是嫁到一个普通软件公司,怎样的环境才能最快的成长呢?首先基本的 公司项目管理水平是必要的;其次是稳健而不保守的公司技术选型和一班能沟通的同事。…

【BZOJ4254】Aerial Tramway 树形DP

【BZOJ4254】Aerial Tramway 题意&#xff1a;给你一座山上n点的坐标&#xff0c;让你在山里建m条缆车&#xff0c;要求缆车两端的高度必须相等&#xff0c;且中间经过的点的高度都小于缆车的高度。并且不能存在一个点位于至少k条缆车的下方。求缆车的最大总长度。 n,m<200,…

C# 读取保存App.config配置文件的完整源码参考

最近出差在北京做一个小项目&#xff0c;项目里需要读取配置文件的小功能&#xff0c;觉得挺有参考意义的就把代码发上来给大家参考一下。我们选择了直接用微软的读取配置文件的方法。 这个是程序的运行设计效果&#xff0c;就是把这些参数可以进行灵活设置&#xff0c;灵活保存…

TensorFlow 简介

TensorFlow介绍 Tagline&#xff1a;An open-source software library for Machine Intelligence.Definition&#xff1a;TensorFlow TM is an open source software library fornumerical computation using data flow graphs.GitHub&#xff1a;https://github.com/tensorfl…

webbrowser设置为相应的IE版本

注册表路径&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 或者HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 究竟选择哪一个…

jmeter压力测试_用Jmeter实现对接口的压力测试

一、多个真实用户对接口的压力测试1. 获取多个真实用户的token的两种方法&#xff1a;1)第一种&#xff1a;让开发帮忙生成多个token(多个用户账户生成的token)&#xff0c;导出为csv格式的文件(以下步骤均以该方法为基础)2)第二种&#xff1a;自己设置多个用户账户和密码&…

程序员成长之路(转)

什么时候才能成为一个专业程序员呢&#xff1f;三年还是五年工作经验&#xff1f;其实不用的&#xff0c;你马上就可以了&#xff0c;我没有骗你&#xff0c;因为专业程序员与业余程序员的区别主要在于一种态度&#xff0c;如果缺乏这种态度&#xff0c;拥有十年工作经验也还是…

嵌入式开发——PWM高级定时器

学习目标 加强掌握PWM开发流程理解定时器与通道的关系掌握多通道配置策略掌握互补PWM配置策略掌握定时器查询方式掌握代码抽取优化策略掌握PWM调试方式学习内容 需求 点亮8个灯,采用pwm的方式。 定时器 通道 <

解决虚拟机时间引起的奇怪问题

一直使用得好好的虚拟机最近出了一个奇怪问题在虚拟机装好的lamp在客户端访问phpmyadmin的时候,使用firefox登录没问题,但是使用IE不行总是停留在登录的界面,而且没有提供任何的出错信息,就连在apache的日志里面也看不到.注意到同样访问的时候,在IE上显示的转向的url是[url]htt…

TensorFlow 基本操作

Tensorflow基本概念 图(Graph):图描述了计算的过程&#xff0c;TensorFlow使用图来表示计算任务。张量(Tensor):TensorFlow使用tensor表示数据。每个Tensor是一个类型化的多维数组。操作(op):图中的节点被称为op(opearation的缩写)&#xff0c;一个op获得/输入0个或多个Tensor…

03_zookeeper伪集群安装

一句话说明白&#xff1a;在1台机器上模拟多台机器&#xff0c;对外提供服务 在理解zookeeper集群安装方法的基础上&#xff0c;本文描述如何将1个机器模拟为3个节点的zookeeper集群&#xff0c;建议先参考阅读本文的前一期 zookeeper伪集群安装总结 在本机上通过复制的方式&am…

python合成语音_MicroPython动手做(25)——语音合成与语音识别

6、AB按键切换语言合成项目[mw_shl_codepython,true]#MicroPython动手做(25)——语音合成与语音识别#AB按键切换语言合成项目from mpython import *import networkimport timeimport ntptimefrom xunfei import *import audiomy_wifi wifi()my_wifi.connectWiFi("zh"…

专访谷歌CEO:像对待家人一样对待员工

导语&#xff1a;《财富》近日公布了“2012年度美国100家最适宜工作的公司”榜单&#xff0c;谷歌当选冠军。即将于2月6日出版的美国《财富》杂志印刷版将刊登对谷歌CEO拉里佩奇(Larry Page)的专访&#xff0c;对谷歌的工作环境进行了介绍。 以下为采访概要&#xff1a; 问&a…

TensorFlow 分布式

一、简介 使用单台机器或者单个GPU/CPU来进行模型训练&#xff0c;训练速度会受资源的影响&#xff0c;因为毕竟单个的设备的计算能力和存储能力具有一定的上限的&#xff0c;针对这个问题&#xff0c;TensorFlow支持分布式模型运算&#xff0c;支持多机器、多GPU、多CPU各种模…

第五周测试

---恢复内容开始--- 一 视频知识 1 linux系统下如何区分内核态与用户态 在内核态&#xff1a;cs:eip可以是任意的地址&#xff0c;4G的内存地址空间 在用户态&#xff1a;cs:eip只能访问0x00000000—0xbfffffff的地址空间 2 系统调用的三层皮&#xff1a;xyz、system_call和sys…