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

server/2025/1/12 7:24:00/

建立连接工作(准备):

首先会加载Myatis的配置文件,因为这些配置文件里面包括了数据源的各种配置,然后通过SqlSessionFactory创建一个SqlSession,然后可以通过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:

接下来,Mybatis会为XML中的每个SQL标签都生成一个MappedStatement对象,这里面有两个属性很重要:

  • ① id:全限定类名+方法名组成的ID
  • sqlSource:当前SQL标签对应的SqlSource对象

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

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

二、Dao接口代理:

我们在项目中经常会看到@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接口方法的时候,实际调用到代理对象的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并返回。

简单总结:

Mybatis是如何和Mysql做联系的,从bean的加载到SQL的执行

首先会加载Myatis的配置文件,因为这些配置文件里面包括了数据源的各种配置,然后通过SqlSessionFactory创建一个SqlSession,然后可以通过SqlSession操作数据库。

然后就是开始解析XML中的SQL语句,Mybatis会把每一个SQL的标签封装成一个SqlSource对象,然后和类的全限定名+方法名组成一个MappedStatement对象,然后添加到Configuration中,这个Configuration里面会有配置信息和所有的SQL信息。

然后执行的时候Myabtis就可以拿到MappedStatement然后通过Executor去执行sql然后返回结果。

四、总结:

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

  • SqlSource以及动态标签SqlNode
  • MappedStatement对象
  • Spring 工厂Bean 以及动态代理
  • SqlSession以及执行器

2、针对有两个XML文件和这个Dao建立关系是否会冲突的问题:不管有几个XML和Dao建立关系,只要保证namespace+id唯一即可。


http://www.ppmy.cn/server/157696.html

相关文章

Android车机DIY开发之学习篇(二)编译Kernel以正点原子为例

Android车机DIY开发之学习篇(二)编译Kernel以正点原子为例 1.代码在/kernel-5.10文件夹下 2.在kernel-5.10目录下执行如下命令编译 &#xff1a; 编译之前&#xff0c;需要将 clang 导出到 PATH 环境变量&#xff1a; 如果是 Android12 执行下面这条命令 export PATH../pr…

doris:手动分区

分区列​ 分区列可以指定一列或多列&#xff0c;分区列必须为 KEY 列。PARTITION 列默认必须为 NOT NULL 列&#xff0c;如果需要使用 NULL 列&#xff0c;应设置 session variable allow_partition_column_nullable true。对于 LIST PARTITION&#xff0c;支持真正的 NULL 分…

Java SE 与 Java EE 简介

诸神缄默不语-个人CSDN博文目录 在学习和使用Java语言时&#xff0c;我们常常会遇到两个常见的术语&#xff1a;Java SE 和 Java EE。它们分别代表了Java的不同应用层次和开发领域。本文将深入介绍Java SE和Java EE的区别、特点以及适用场景&#xff0c;帮助大家更好地理解这两…

js代理模式

允许在不改变原始对象的情况下&#xff0c;通过代理对象来访问原始对象。代理对象可以在访问原始对象之前或之后&#xff0c;添加一些额外的逻辑或功能。 科学上网过程 一般情况下,在访问国外的网站,会显示无法访问 因为在dns解析过程,这些ip被禁止解析,所以显示无法访问 引…

7 分布式定时任务调度框架

先简单介绍下分布式定时任务调度框架的使用场景和功能和架构&#xff0c;然后再介绍世面上常见的产品 我们在大型的复杂的系统下&#xff0c;会有大量的跑批&#xff0c;定时任务的功能&#xff0c;如果在独立的子项目中单独去处理这些任务&#xff0c;随着业务的复杂度的提高…

B+树在MySQL中的应用价值

为什么MySQL选择B树存储数据 在数据库管理系统中&#xff0c;存储和查询数据的效率直接影响系统的性能。MySQL 作为最常用的关系型数据库之一&#xff0c;其存储引擎&#xff08;例如 InnoDB&#xff09;选择了 B 树作为索引的数据结构。这种选择并非偶然&#xff0c;而是经过…

Java基础:equals()方法与==的区别

1、超类Object的equals()底层原理&#xff1a; 在Object超类中已经提供了equals()方法&#xff0c;源码如下&#xff1a; public boolean equals(Object obj) { return (this obj); } 所有的对象都拥有标识&#xff08;内存地址&#xff09;和状态&#xff08;数据&a…

Java Web开发进阶——Spring Security基础与应用

Spring Security是Spring框架的核心模块之一&#xff0c;用于保护Web应用程序和微服务的安全。它提供强大的认证和授权功能&#xff0c;并与Spring生态系统无缝集成。本节将详细介绍Spring Security的基础知识及其在实际项目中的应用。 1. Spring Security概述与功能 1.1 什么…