MyBatis+Springboot 启动到SQL执行全流程(2)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: MyBatis+Springboot 启动到SQL执行全流程

三、流程2 —— 生成代理并暴露

流程1主要是为了做一个准备,扫描Mapper文件并解析保存。但是仅仅这样是不够的,你还需要给系统暴露一个入口,这样别人才能调用该sql,java中,我们总是通过对象来调用放啊,因此这里我们就需要对Mapper接口去生成代理对象了。不过,对象不需要我们手动创建,在mybatis-spring包中,mybatis已经对结合Spring的场景做了处理,会自动扫描并创建代理,并存储进spring容器中。


1. 扫描Mapper并创建Bean定义

同扫描xml文件一样,这也需要指定扫描的Mapper接口的位置

99b3f731adda4c7ea54192244bfd0508.png

然后就到了一个重点类: MapperScannerConfigurer,我们都知道,Spring启动的核心方法是Refresh,而其中有一步就是调用各工厂后置处理器

d39656ae6a304d97b2149f3d73043726.png

而 MapperScannerConfigurer 实现了 BeanDefinitionRegistryPostProcessor 接口,BeanDefinitionRegistryPostProcessor 继承自工厂后置处理器(BeanFactoryPostProcessor),所以,其在这一步内会被调用,最终的结果就是执行扫描方法

a574cd8633964fbfae30f264945b6316.png

2476d189eb3048439f7fd7558e4b18da.png

987f58fd523441aca5716bc38f95b5c1.png

生成的Bean定义们,最后自然会放入注册器中,等待实例化。


2. 实例化并注入

上面,我们说注册了个Bean定义,bean名字还叫Mapper,其实际的类已经变成了FactoryBeanFactory,如下图:

5b0a9c19f9384b68ae3f622cc6684a12.png


但是,如果各位学习过前面我们关于factoryBean的内容,就应该知道,当我们从spring容器里获取这类Bean的时候,取的并不是该Bean,而是该Bean生产出来的其他对象

  // MapperFactyoryBean.java
  @Override
  public T getObject() throws Exception {
    return getSqlSession().getMapper(this.mapperInterface);
  }

不难看出,最后是在会话中去获取一个对象,所谓会话中获取,其实最终还是要到我们上面提到的Configuration里去取,该配置对象里面有一个MapperRegistry,而从(二、1. 扫描xml文件)里,我们就提过,在扫描解析xml的时候,会向myBatisConfiguration里注册命名空间,就是存在着个位置的。此刻,就要通过这个地方,创建代理了。

7ea97743e6e84b4999ba88824630e77f.png

创建代理的详情如下,最终我们将返还一个Proxy代理对象。最终这个对象会被注入到各其他Bean里面

c505f16a266a45239ffd375f063692b5.png

我们可以看到,最终注入的确实是一个代理对象,而非所谓的mapperFactoryBean对象。


f56cb532fd9c424a8fe390874bdd2d19.png


四、流程3 —— 获取会话并执行

上面两个流程,我们其实已经做了相当多的准备,我们已经创建了 sqlSessionFactory,也把各sql解析成了MapperStatement,也在各个调用方那边注入了一个代理对象。至此三方都完成,接下来可以通过代理对象进行真正的执行了。

这里引用一张时序图:前面的步骤我们已经完成,关键在于最后的invoke

91d0223eadb0455b9d1ba66f5089ee0d.png

如果看不清,可以直接下载 mybatis sql执行时序图。

总体来说,执行可分为 获取会话->会话执行->执行器执行->statement->jdbc ,其中statement是java定义的接口,用来执行sql的,而mybatis 和 springboot 都提供了实现类。

执行器的扩展相关内容详见 Mybatis的CachingExecutor与二级缓存


需要注意的是,mybatis为用户留下了一些“”插件空间“,用户可以按规则制定一些插件,从而在上述执行的某个阶段,做出一些操作,其实现原来类似于“切面增强”,关于这部分插件,我们下次会详细说明


五、 总结

总体来说,sql执行过程分三块,


一块是mybatis自己的读取xml和配置,生成会话工厂;解析出sql内容并注册起来,并生成代理(下图左框部分 + 中间两个对象)

二是为spring服务的,暴露代理对象给spring使用(下图jdkProxy)

三是通过代理对象,拿到sqlSession会话真正执行sql (下图9、10、11步)



19e582428ab34d4da0597cabee6350eb.png

目录
相关文章
|
17天前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
33 4
|
17天前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
30 3
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
22天前
|
Java 数据库连接 数据库
spring和Mybatis的逆向工程
通过本文的介绍,我们了解了如何使用Spring和MyBatis进行逆向工程,包括环境配置、MyBatis Generator配置、Spring和MyBatis整合以及业务逻辑的编写。逆向工程极大地提高了开发效率,减少了重复劳动,保证了代码的一致性和可维护性。希望这篇文章能帮助你在项目中高效地使用Spring和MyBatis。
12 1
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
142 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
70 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
21天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
46 10
|
2月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
175 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
37 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。