Mybatis原理学习

简介: Mybatis原理学习

03408FF8-5FDA-4481-B0A3-0E07B19FB3BD

一、Mybatis的整体架构

5934B3CC-348B-497C-9A9E-9F13F752F936

Mybatis的架构分为三层:

接口层:Mybatis有两种交互方式,一种是通过API方式,这种主要是通过sqlSession来进行操作;另一种是通过Mapper接口来交互,这种是将每个Mapper接口的方法和参数确定一个statementId,底层还是通过sqlSession的方式来执行。

数据处理层:数据处理层主要功能的是根据传入的参数动态生成sql,并且做好参数类型的映射,在查询完sql结果后,再将结果包装成List返回。

框架支持层:该层主要实现Mybatis的一些特性,包括事务管理、连接池管理、缓存机制等。

Mybatis的主要执行流程:

Mybatis启动过程:解析config.xml-->解析xml映射文件—>每个方法生成mappedStatement-->生成configuration对象

Mybatis执行一句sql流程:sqlSession-->Executor-->StatementHandler(封装了JDBC的操作)-->ParameterHandler-->ResultSetHandler-->TypeHandler-->根据用户的参数结合mappedStatement动态生成BoundSql

7A9FDE59-4CC1-4645-A4C3-014A7EA6AF34

二、Mybatis初始化过程

1.配置文件Mybatis-config.xml解析过程

A5106518-CBF1-43AE-B82F-E5BAFB8E8B2D

初始化步骤:

  1. 调用SqlSessionFactoryBuilder对象的build(inputStream)方法;
  2. SqlSessionFactoryBuilder会根据输入流inputStream等信息创建XMLConfigBuilder对象;
  3. SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法;
  4. XMLConfigBuilder对象返回Configuration对象;
  5. SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSessionFactory对象;
  6. SqlSessionFactoryBuilder返回 DefaultSessionFactory对象给Client,供Client使用。

2.Mapper映射文件解析过程

select方法是最常见的映射方法,其配置也是最复杂的,可以通过resultMap来简化映射的关系。

<select
     <!--  1. id (必须配置)
        id是命名空间中的唯一标识符,可被用来代表这条语句。 
        一个命名空间(namespace) 对应一个dao接口, 
        这个id也应该对应dao里面的某个方法(相当于方法的实现),因此id 应该与方法名一致
     -->

     id="selectPerson"

     <!-- 2. parameterType (可选配置, 默认为Mybatis自动选择处理)
        将要传入语句的参数的完全限定类名或别名, 如果不配置,Mybatis会通过ParameterHandler 根据参数类型默认选择合适的typeHandler进行处理
        parameterType 主要指定参数类型,可以是int, short, long, string等类型,也可以是复杂类型(如对象) -->
     parameterType="int"

     <!-- 3. resultType (resultType 与 resultMap 二选一配置)
         resultType用以指定返回类型,指定的类型可以是基本类型,可以是java容器,也可以是javabean -->
     resultType="hashmap"

     <!-- 4. resultMap (resultType 与 resultMap 二选一配置)
         resultMap用于引用我们通过 resultMap标签定义的映射类型,这也是Mybatis组件高级复杂映射的关键 -->
     resultMap="personResultMap"

     <!-- 5. flushCache (可选配置)
         将其设置为 true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false -->
     flushCache="false"

     <!-- 6. useCache (可选配置)
         将其设置为 true,将会导致本条语句的结果被二级缓存,默认值:对 select 元素为 true -->
     useCache="true"

     <!-- 7. timeout (可选配置) 
         这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)-->
     timeout="10000"

     <!-- 8. fetchSize (可选配置) 
         这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)-->
     fetchSize="256"

     <!-- 9. statementType (可选配置) 
         STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 Mybatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED-->
     statementType="PREPARED"

     <!-- 10. resultSetType (可选配置) 
         FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个,默认值为 unset (依赖驱动)-->
     resultSetType="FORWARD_ONLY">

三、Mybatis执行一句sql流程

Mybatis是通过sqlSession来和数据库进行通信的,每个sqlSession对应一次数据库会话。sqlSession创建的流程如下:

10B3BBCC-07AC-4336-85C5-2EDE0C18D716

获取sqlSession的步骤:

  1. 从Configuration中获取Environment;
  2. 从Environment中取得DataSource;
  3. 从Environment中取得TransactionFactory;
  4. 从DataSource里获取数据库连接对象Connection;
  5. 在取得的数据库连接上创建事务对象Transaction;
  6. 创建Executor对象(该对象非常重要,事实上sqlsession的所有操作都是通过它完成的);
  7. 创建sqlsession对象。

Executor执行MappedStatement:

sqlSession是个门面,真正执行的是Executor,Executor通过动态代理的方式将任务扔给MapperProxy;

92437B21-6730-4375-90F7-3CB89D996C9C

StatementHandler:最后sql的处理都是通过 StatementHandler,简单来说就是他包装了JDBC的操作;

四、Mybatis的主要特性

1.动态sql

主要是要区分SqlSource和BoundSql,前者是Mapper映射文件的对象,后者是解析好的sql对象,Mybatis会将动态sql解析成对应的BoundSql。

2.插件机制

Mybatis允许对映射文件配置好的sql语句进行拦截后进行处理,其实现方式是通过实现接口Interceptor来实现。

3.数据库连接池

Mybatis可以通过配置数据库连接池来对connection进行复用,可选择的连接池方案为:(1)UNPOOLED 不使用连接池的数据源;(2)POOLED 使用连接池的数据源;(3)JNDI 使用JNDI实现的数据源.

4.事务管理

Mybatis使用了JDBC的事务管理器,但如果集成了Spring,则可以不配置事务管理器,Spring的事务管理器会将其纳入事务管理。

5.缓存管理

Mybatis通过二级缓存来进行缓存管理,一级缓存是通过Mybatis自带的Map数据类型,来缓存执行过的SQL结果,每次执行Executor会在该Map中查询是否有相关执行的结果;二级缓存是可以配置第三方的缓存实现,比如redis或memcached等。


参考资料

目录
相关文章
|
8月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
10月前
|
缓存 NoSQL Java
Mybatis学习:Mybatis缓存配置
MyBatis缓存配置包括一级缓存(事务级)、二级缓存(应用级)和三级缓存(如Redis,跨JVM)。一级缓存自动启用,二级缓存需在`mybatis-config.xml`中开启并配置映射文件或注解。集成Redis缓存时,需添加依赖、配置Redis参数并在映射文件中指定缓存类型。适用于查询为主的场景,减少增删改操作,适合单表操作且表间关联较少的业务。
192 6
|
12月前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
2608 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
Java 关系型数据库 数据库连接
mybatis-plus学习
MyBatis-Plus ,MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。
169 5
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
SQL XML Java
Mybatis的原理和MybaitsPlus
这篇文章对比分析了Mybatis和Mybatis Plus的特点与底层实现机制,探讨了两者之间的差异及各自的优势。
363 0
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。