Mybatis中 Dao接口和XML文件的SQL如何建立关联

京东面试官:在Mybatis中 Dao接口和XML文件的SQL如何建立关联? 简单来说,它就是通过JDK动态代理,返回了一个Dao接口的代理对象 MapperProxy,当我们通过 @Autowired 注入Dao接口时,注入的就是这个代理对象,我们调用 Dao接口中的方法时,则会调用到 MapperProxy 对象的invoke()方法。到目前为止,XML就解析完成了,当我们执行Mybatis方法的时候,就可以通过 “全限定类名+方法名” 找到 MappedStatement 对象,然后解析里面的SQL内容并进行执行即可。在这里,实际上调用的就是SqlSession里面的东西了。 阅读详情

一、解析XML:

首先,Mybatis在初始化 SqlSessionFactoryBean 的时候,找到 mapperLocations 路径去解析里面所有的XML文件,这里我们重点关注两部分。

1、创建SqlSource:

Mybatis会把每个SQL标签封装成SqlSource对象。然后根据SQL语句的不同,又分为动态SQL和静态SQL。其中,静态SQL包含一段String类型的sql语句;而动态SQL则是由一个个SqlNode组成。

假如我们有这样一个SQL:

<select id="getUserById" resultType="user">
    select * from user 
    <where>
        <if test="uid!=null">
            and uid=#{uid}
        </if>
    </where>
</select>    
 

它对应的SqlSource对象看起来应该是这样的:

2、创建MappedStatement:

ML文件中的每一个SQL标签就对应一个MappedStatement对象,这里面有两个属性很重要。

① id:全限定类名+方法名组成的ID。

② sqlSource:当前SQL标签对应的SqlSource对象。

创建完 MappedStatement对象,将它缓存到 Configuration 中。Configuration对象就是Mybatis中的大管家,基本所有的配置信息都维护在这里。把所有的XML都解析完成之后,Configuration就包含了所有的SQL信息。

到目前为止,XML就解析完成了。当我们执行Mybatis方法的时候,就通过全限定类名+方法名找到MappedStatement对象,然后解析里面的SQL内容,执行即可。

二、Dao接口代理:

我们的Dao接口并没有实现类,那么,我们在调用它的时候,它是怎样最终执行到我们的SQL语句的呢?

首先,我们在Spring配置文件中,一般会这样配置:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="com.viewscenes.netsupervisor.dao" />
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>

或者你的项目是基于SpringBoot的,那么肯定也见过这种: @MapperScan("com.xxx.dao")

它们的作用是一样的。将包路径下的所有类注册到Spring Bean中,并且将它们的beanClass设置为 MapperFactoryBean。MapperFactoryBean 实现了 FactoryBean 接口,俗称工厂Bean。那么,当我们通过 @Autowired 注入这个Dao接口的时候,返回的对象就是MapperFactoryBean 这个工厂Bean中的 getObject() 方法对象。

那么,这个方法干了些什么呢?

简单来说,它就是通过JDK动态代理,返回了一个Dao接口的代理对象,这个代理对象的处理器是MapperProxy对象。所有,我们通过@Autowired注入Dao接口的时候,注入的就是这个代理对象,我们调用到Dao接口的方法时,则会调用到MapperProxy对象的invoke()方法。

那么,目前为止,我们通过Dao接口也有了代理实现,所以就可以执行到它里面的方法了。

三、执行:

如上所述,当我们调用Dao接口方法的时候,实际调用到代理对象的invoke()方法。 在这里,实际上调用的就是SqlSession里面的东西了。

public class DefaultSqlSession implements SqlSession {
 
	public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
		try {
			MappedStatement ms = configuration.getMappedStatement(statement);
			return executor.query(ms, 
				wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
		}
	}
}

看到以上代码,说明我们想的不错。它就是通过statement(全限定类型+方法名)拿到MappedStatement 对象,然后通过执行器Executor去执行具体SQL并返回。

四、总结:
1、针对Mybatis中的Dao接口和XML文件里的SQL是如何建立关系的问题,主要可以归纳为下面几点小点:

SqlSource以及动态标签SqlNode
MappedStatement对象
Spring 工厂Bean 以及动态代理
SqlSession以及执行器
2、针对有两个XML文件和这个Dao建立关系是否会冲突的问题:不管有几个XML和Dao建立关系,只要保证namespace+id唯一即可。

Simulink小白必看:用Simscape轻松搭建二阶倒立摆模型(附完整参数配置) 本文为Simulink初学者提供了使用Simscape Multibody模块库,从零开始搭建二阶倒立摆非线性物理模型的完整实战教程。文章详细讲解了如何通过物理组件(如刚体、关节)直观建模,替代复杂的数学推导,并涵盖参数配置、仿真调试及模型线性化方法,帮助读者快速掌握这一高效的物理建模路径。 阅读详情

相关推荐

DeepSeek绝了!3分钟生成PPT,专治“五彩斑斓的黑“!!(保姆教程)

DeepSeek绝了!3分钟生成PPT,专治"五彩斑斓的黑"!!(保姆教程)

yizhen91y的博客 4万+

【MyBatis】Dao接口和Dao.xml文件如何建立连接

1.首先在程序运行开始时,MyBatis会检查配置文件Dao.xml,通过mapper标签对dao接口进行一对一的映射(namespace保持唯一) <mapper namespace="com.alan.hrsys.dao.DepartmentDao"> 2.再扫描xml文件其余的部分,xml文件的每个具体操作都通过id和Dao接口的操作名进行对应。相当于Dao接口是领导,告诉xml小弟,我要实现个莫子功能,然后xml具体和数据库对接操作。 Dao接口 public List<Depa

weixin_45156425的博客 7433

Frida实战:SSL Pinning绕过技术全解析

本文详细解析了如何使用Frida工具绕过SSL Pinning技术,包括环境搭建、四种实战绕过方案及常见问题排查指南。通过具体代码示例和实战经验,帮助安全研究人员快速掌握SSL Pinning绕过技术,适用于金融类App的安全测试场景。

weixin_42530732的博客 187

【SpringBoot整合Mybatis踩坑--在resources下建立了mapper.xml文件但是 运行显示没有匹配到对应的mapper类Invalid bound statement (no】

首先查看生成的traget文件是否有自己对应路径下的mapper.xml文件。大概率是没有这个mapper文件造成nvalid bound statement (no)这个问题。解决办法:maven clean一下重新运行。

qq_21506765的博客 540

RDMA学习笔记-IB五层网络协议和报文结构

Reference InfiniBand Architecture Specification Volume 1, Release 1.3 文章目录IBA 网络协议分层1.链路层1.1 LRH1.2 ICRC1.3 VCRC2.网络层(GRH)3.传输层3.1 BTH3.2 extended transport header4. 报文结构4.1 send request4.2 RDMA Write request4.3 RDMA Read request4.4 ACK4.5 Atomic operatio

u014114310的博客 9466

SpringCloud2025+SpringBoot3.5.0+gateway+webflux子服务路由报503

本来昨天就应该也记录下,免得忘记的,但是有点晚了,酒没写,真的是被坑惨了。当然这也是追求最新的代价,也是对新技术、老知识点的重温。依赖更粒度让架构的知识面更高,需要非常清楚另外说不定是有新的负载均衡要出现了,就想当初loadbalancer取代Ribbon一样好了,真是坑了半夜,昨晚都没有写,今天才复盘,希望能帮到大家,让更多在坑里的技术人爬出来。

zwrlj527的专栏 1998

mybatis 当dao层和xml在同一文件夹所需配置

<!--要放到dependencies标签外面--> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include

weixin_45448319的博客 786

【软考高级架构】论文范文17——论软件系统架构评估及其应用(ATAM)

软件系统架构评估是保障系统质量属性满足业务目标的关键环节,架构权衡分析方法(Architecture Trade-off Analysis Method,ATAM)作为一种主流的架构评估方法,通过场景识别、敏感点与权衡点分析、风险与非风险决策识别等系统化活动,能够在架构设计早期发现潜在问题,降低后期修改成本。本文以笔者主导的某省级智慧医疗平台架构评估项目为案例,围绕ATAM方法的应用展开论述。笔者担任系统架构师,负责组织评估团队、引导场景捕获、分析架构决策、识别风险与权衡点。

qq837993702的博客 490

Mybatis如何做到dao.java与mapper.xml对应的

转:http://www.jb51.net/article/116402.htm 本文主要介绍的是关于mybatis通过接口查找对应mapper.xml及方法执行的相关内容,下面话不多说,来看看详细的介绍: 在使用mybatis的时候,有一种方式是 1 BookMapper bookMapper = SqlSessi...

My_Way666的博客 1502

实战|mitmproxy+Playwright 拦截篡改Cloudflare验证流程,实现无感爬取(2026实测可用)

2026年对抗Cloudflare,别再死磕滑块、轨迹、算法。高伪装浏览器 + 中间层劫持篡改验证流程Playwright + mitmproxy = 无感过CF这篇是纯实战、无废话、可直接上线的方案。你只要把目标网站、cf_clearance填进去,就能跑通。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1284

Python开发MCP Client

全部例子只是MCP Client访问MCP Server的过程,那么这样其实就失去了MCP协议的创建的初衷,和大模型集成后才能发挥MCP最大的作用。

Criss@陈磊 2973

Mybatis总结面试题答案-通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?

结合自己碰到的面试题,详细解答,结合源码回答 1.通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗? 当我们使用mapper的时候.会调用sqlsession的getMapper()方法, 进而调用Configuration的getMapper()方法,进而调用MapperRegistry的getMapper()方法,进入到 mapperRegistry.getMapper() 中 public <T> T g

weixin_47008115的博客 1037

Allegro基本规则设置指导书之Spacing Region

当网络需要在Region中需要按照自身的规则匹配时,可以创建Region Class来匹配。Region也支持Class to Class规则,点击ok即可。Allegro基本规则设置指导书之Spacing Region。下面介绍基本规则设置指导书之Spacing Region。给创建好的Region 匹配一个规则。空白的地方创建一个Region。

weixin_54787054的博客 564

腾讯一面:Mybatis中 Dao接口和XML文件的SQL如何建立关联?

01解析XML首先,Mybatis 在初始化 SqlSessionFactoryBean 时,会找到 mapperLocations 配置的路径下中所有的XML文件并进行解析,这里我们重点关注两部分:1、创建SqlSource:Mybatis会把每个SQL标签封装成SqlSource对象,然后根据SQL语句的不同,又分为动态SQL和静态SQL。其中,静态SQL包含一段String类型的sql语句;而动态SQL则是由一个个SqlNode组成。假如我们有这样一个SQL:<select&nbsp;i

资料免费分享,点击名片 1376

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Mybatis中 Dao接口和XML文件的SQL如何建立关联?

它们的作用是一样的,就是将包路径下的所有类注册到 Spring Bean 中,并将它们的beanClass设置为 MapperFactoryBean,MapperFactoryBean 实现了 FactoryBean 接口,俗称工厂Bean。简单来说,它就是通过JDK动态代理,返回了一个Dao接口的代理对象 MapperProxy,当我们通过 @Autowired 注入Dao接口时,注入的就是这个代理对象,我们调用 Dao接口中的方法时,则会调用到 MapperProxy 对象的invoke()方法。...

weixin_69413377的博客 247

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

灵魂拷问:Mybatis中 Dao接口和XML文件的SQL如何建立关联?

01解析XML首先,Mybatis 在初始化 SqlSessionFactoryBean 时,会找到 mapperLocations 配置的路径下中所有的XML文件并进行解析,这里我们重点关注两部分:1、创建SqlSource:Mybatis会把每个SQL标签封装成SqlSource对象,然后根据SQL语句的不同,又分为动态SQL和静态SQL。其中,静态SQL包含一段String类型的sql语句;而动态SQL则是由一个个SqlNode组成。假如我们有这样一个SQL:<select&nbsp;i

jjc4261的博客 390

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

面试官:Mybatis中 Dao接口和XML文件的SQL如何建立关联?

01解析XML首先,Mybatis 在初始化 SqlSessionFactoryBean 时,会找到 mapperLocations 配置的路径下中所有的XML文件并进行解析,这里我们重点关注两部分:1、创建SqlSource:Mybatis会把每个SQL标签封装成SqlSource对象,然后根据SQL语句的不同,又分为动态SQL和静态SQL。其中,静态SQL包含一段String类型的sql语句;而动态SQL则是由一个个SqlNode组成。假如我们有这样一个SQL:<select&nbsp;i

知识分享官 511

.sql文件_阿里面试题:Mybatis中的Dao接口和XML文件里的SQL是如何建立关系的?

前言昨天,笔者在一篇面经中突然看到阿里的这样一道面试题:Mybatis中的Dao接口和XML文件里的SQL是如何建立关系的? 如果有两个XML文件和这个DAO建立关系,岂不是冲突了?如果你看过笔者关于Mybatis源码分析的往期博文,相信你肯定可以给出一个不错的答案。但鉴于系列文章篇幅较大,而且重点是源码部分的解读,所以笔者想再针对这个问题,再梳理下整个流程。本文配合下列文章,食用更佳。...

weixin_39854070的博客 97

Dao 接口和 XML 文件里的 SQL 是如何一一对应的?

MyBatis 会先解析这些 XML 文件,通过 XML 文件里面的命名空间 (namespace)跟 DAO 建立关系;然后 XML 中的每段 SQL 会有一个id 跟 DAO 中的接口进行关联。

m0_46376464的博客 1097

Mybatis知识

在mybatis中任意定义接口,将接口与xml语句绑定,直接调用方法名就可以。实现方式:1.使用注解,在接口上面加注解2.使用xml文件,注意namespace必须为接口的全路径名。

m0_61453929的博客 283

MyBatis 的 DAO 接口跟 XML 文件里面的 SQL 是如何建立关系的?

我们在使用 MyBatis 的时候,都用的是 Dao 接口和 XML 文件里的 SQL 一一对应来进行使用的。那你是否思考过二者是如何建立关系的?在开始正文之前,首先解释 Dao 接口和...

Java极客技术 2412

面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?

mybatis 常问的面试题,你懂了吗?

程序员囧辉 2万+

Mybatis中的Dao接口和XML文件里的SQL是如何建立关系的

看到阿里这道面试题的时候,我就知道是时候看下mybatis源码了准...

Jesse_cool的博客 8055
上一篇: Redis Cluster集群数据分片机制原理
下一篇: 极简配置的SpringBoot:mybatis常见面试题汇总
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值