mybatis工作原理通俗理解,mybatis真实原理

首页 > 经验 > 作者:YD1662022-10-29 11:27:50

2.3.2 SqlSession 生命周期

SqlSessions 是由 SqlSessionFactory 实例创建的;而 SqlSessionFactory

是由 SqlSessionFactoryBuilder 创建的。

???? 注意:当 MyBatis 与一些依赖注入框架(如 Spring 或者 Guice)同时使用时,SqlSessions 将被依赖注入框架所创建,

所以你不需要使用 SqlSessionFactoryBuilder 或者 SqlSessionFactory。

每个线程都应该有它自己的 SqlSession 实例。

SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。正确在 Web 中使用 SqlSession 的场景是:每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。

编程模式:

try (SqlSession session = sqlSessionFactory.openSession) { // 你的应用逻辑代码}

2.4. 映射器

2.4.1 映射器职责

映射器是一些由用户创建的、绑定 SQL 语句的接口。

SqlSession 中的 insert、update、delete 和 select 方法都很强大,但也有些繁琐。更通用的方式是使用映射器类来执行映射语句。一个映射器类就是一个仅需声明与 SqlSession 方法相匹配的方法的接口类。

MyBatis 将配置文件中的每一个 <mapper> 节点抽象为一个 Mapper 接口,而这个接口中声明的方法和跟 <mapper> 节点中的 <select|update|delete|insert> 节点相对应,即 <select|update|delete|insert> 节点的 id 值为 Mapper 接口中的方法名称,parameterType 值表示 Mapper 对应方法的入参类型,而 resultMap 值则对应了 Mapper 接口表示的返回值类型或者返回结果集的元素类型。

MyBatis 会根据相应的接口声明的方法信息,通过动态代理机制生成一个 Mapper 实例;MyBatis 会根据这个方法的方法名和参数类型,确定 Statement id,然后和 SqlSession 进行映射,底层还是通过 SqlSession 完成和数据库的交互。

下面的示例展示了一些方法签名以及它们是如何映射到 SqlSession 上的。

mybatis工作原理通俗理解,mybatis真实原理(5)

注意:

2.4.2 映射器生命周期

映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲,任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此,映射器实例的最佳作用域是方法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可丢弃。

编程模式:

try (SqlSession session = sqlSessionFactory.openSession) { BlogMapper mapper = session.getMapper(BlogMapper.class); // 你的应用逻辑代码}

映射器注解

MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的。MyBatis 3 以后,支持注解配置。注解配置基于配置 API;而配置 API 基于 XML 配置。

MyBatis 支持诸如 @Insert、@Update、@Delete、@Select、@Result 等注解。

详细内容请参考:MyBatis 官方文档之 sqlSessions,其中列举了 MyBatis 支持的注解清单,以及基本用法。

三、 MyBatis 的架构

从 MyBatis 代码实现的角度来看,MyBatis 的主要组件有以下几个:

这些组件的架构层次如下:

mybatis工作原理通俗理解,mybatis真实原理(6)

3.1. 配置层

配置层决定了 MyBatis 的工作方式。

MyBatis 提供了两种配置方式:

SqlSessionFactoryBuilder 会根据配置创建 SqlSessionFactory ;SqlSessionFactory 负责创建 SqlSessions 。

3.2. 接口层

接口层负责和数据库交互的方式。MyBatis 和数据库的交互有两种方式:

1)使用 SqlSession:SqlSession 封装了所有执行语句,获取映射器和管理事务的方法。

2)使用 Mapper 接口:MyBatis 会根据相应的接口声明的方法信息,通过动态代理机制生成一个 Mapper 实例;MyBatis 会根据这个方法的方法名和参数类型,确定 Statement Id,然后和 SqlSession 进行映射,底层还是通过 SqlSession 完成和数据库的交互。

3.3. 数据处理层

数据处理层可以说是 MyBatis 的核心,从大的方面上讲,它要完成两个功能:

1)根据传参 Statement 和参数构建动态 SQL 语句

2)执行 SQL 语句以及处理响应结果集 ResultSet

3.4. 框架支撑层

1) 事务管理机制 - MyBatis 将事务抽象成了 Transaction 接口。MyBatis 的事务管理分为两种形式:

2) 连接池管理

3) SQL 语句的配置 - 支持两种方式:

4) 缓存机制 - MyBatis 采用两级缓存结构;

  1. 一级缓存的生命周期是 Session 会话级别的。

  1. 如果开启了二级缓存,SqlSession 会先使用 CachingExecutor 对象来处理查询请求。CachingExecutor 会在二级缓存中查看是否有匹配的数据,如果匹配,则直接返回缓存结果;如果缓存中没有,再交给真正的 Executor 对象来完成查询,之后 CachingExecutor 会将真正 Executor 返回的查询结果放置到缓存中,然后在返回给用户。

  2. 二级缓存的生命周期是应用级别的。

mybatis工作原理通俗理解,mybatis真实原理(7)

四、SqlSession 内部工作机制

从前文,我们已经了解了,MyBatis 封装了对数据库的访问,把对数据库的会话和事务控制放到了 SqlSession 对象中。那么具体是如何工作的呢?接下来,我们通过源码解读来进行分析。

mybatis工作原理通俗理解,mybatis真实原理(8)

上一页123下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.