从源码角度分析 Mybatis 工作原理

本文从源码角度详细分析了MyBatis的工作原理,包括MyBatis的完整示例、配置、Mapper的使用,以及SqlSession的生命周期。重点讲解了SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession的角色和生命周期,以及Executor、StatementHandler、ParameterHandler、ResultSetHandler等核心组件的职责。通过对测试程序的剖析,展示了MyBatis如何通过Mapper接口和SqlSession执行SQL操作。最后,概述了MyBatis的架构,包括配置层、接口层、数据处理层和框架支撑层,以及SqlSession的内部工作机制。
摘要由CSDN通过智能技术生成

一、MyBatis 完整示例

这里,我将以一个入门级的示例来演示 MyBatis 是如何工作的。

注:本文后面章节中的原理、源码部分也将基于这个示例来进行讲解。完整示例源码地址

1.1. 数据库准备

在本示例中,需要针对一张用户表进行 CRUD 操作。其数据模型如下:

CREATE TABLE IF NOT EXISTS user (

1.2. 添加 MyBatis

如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:

<dependency>

1.3. MyBatis 配置

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。

本示例中只是给出最简化的配置。【示例】MyBatis-config.xml 文件

<?xml version="1.0" encoding="utf-8"?>

说明:上面的配置文件中仅仅指定了数据源连接方式和 User 表的映射配置文件。

1.4 Mapper

1.4.1 Mapper.xml

个人理解,Mapper.xml 文件可以看做是 MyBatis 的 JDBC SQL 模板。【示例】UserMapper.xml 文件。

下面是一个通过 MyBatis Generator 自动生成的完整的 Mapper 文件。

<?xml version="1.0" encoding="UTF-8"?>

1.4.2 Mapper.java

Mapper.java 文件是 Mapper.xml 对应的 Java 对象。【示例】UserMapper.java 文件

public interface UserMapper {

对比 UserMapper.java 和 UserMapper.xml 文件,不难发现:UserMapper.java 中的方法和 UserMapper.xml 的 CRUD 语句元素( 、、、)存在一一对应关系。

在 MyBatis 中,正是通过方法的全限定名,将二者绑定在一起。

1.4.3 数据实体.java

【示例】User.java 文件

public class User {

、、、 的 parameterType 属性以及  的 type 属性都可能会绑定到数据实体。这样就可以把 JDBC 操作的输入输出和 JavaBean 结合起来,更加方便、易于理解。

1.5. 测试程序

【示例】MyBatisDemo.java 文件

public class MyBatisDemo {

**说明:**SqlSession 接口是 MyBatis API 核心中的核心,它代表 MyBatis 和数据库一次完整会话。

  • MyBatis 会解析配置,并根据配置创建 SqlSession 。

  • 然后,MyBatis 将 Mapper 映射为 SqlSession,然后传递参数,执行 SQL 语句并获取结果。

二、MyBatis 生命周期

image.png

2.1. SqlSessionFactoryBuilder

2.1.1 SqlSessionFactoryBuilder 的职责

SqlSessionFactoryBuilder 负责创建

SqlSessionFactory 实例。

SqlSessionFactoryBuilder 可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

Configuration 类包含了对一个 SqlSessionFactory 实例你可能关心的所有内容。

image.png

SqlSessionFactoryBuilder 应用了建造者设计模式,它有五个 build 方法,允许你通过不同的资源创建 SqlSessionFactory 实例。

SqlSessionFactory build(InputStream inputStream)

2.1.2 SqlSessionFactoryBuilder 的生命周期

SqlSessionFactoryBuilder 可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。

你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

2.2. SqlSessionFactory

2.2.1 SqlSessionFactory 职责

SqlSessionFactory 负责创建 SqlSession 实例。

image.png

SqlSessionFactory 应用了工厂设计模式,它提供了一组方法,用于创建 SqlSession 实例。

SqlSession openSession()

方法说明:

默认的 openSession() 方法没有参数,它会创建具备如下特性的 SqlSession:

1)事务作用域将会开启(也就是不自动提交)。

  • 将由当前环境配置的 DataSource 实例中获取 Connection 对象。

  • 事务隔离级别将会使用驱动或数据源的默认设置。

  • 预处理语句不会被复用,也不会批量处理更新。

2)TransactionIsolationLevel 表示事务隔离级别,它对应着 JDBC 的五个事务隔离级别。

3)ExecutorType 枚举类型定义了三个值:

  • ExecutorType.SIMPLE:该类型的执行器没有特别的行为。它为每个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值