Mybatis的工作原理


1、工作原理

在这里插入图片描述

  1. 读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
  2. 加载映射文件:映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
  3. 构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
  4. 创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法,是一个既可以发送sql执行并返回结果的,也可以获取mapper的接口
  5. Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
  6. MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
  7. 输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
  8. 输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

2、Mybatis基本构成

2.1、SqlSessionFactoryBuilder

在这里插入图片描述

2.2、SqlSessionFactory

作用:创建sqlSession,sqlSession是一个会话,相当于jdbc中的Connection对象

  • 每次访问数据库就要通过SqlSessionFactory创建sqlSession,所以SqlSessionFactory会在mybatis整个生命周期都会使用
  • 如果多次创建同一个数据库的SqlSessionFactory,每次创建SqlSessionFactory会打开更多的数据库连接资源,连接资源会被耗尽,所以这个采用单例模式。一个数据库只对应一个SqlSessionFactory

2.3、SqlSession

sqlSession是一个外观模式,提供基本API:增删改查,还有辅助API,也就是提交、关闭会话

2.3.1、SqlSession是什么?

SqlSession是一个会话,相当于jdbc的一个connection对象,生命周期是在请求数据库处理事务的过程中,线程不安全的对象。

每次创建SqlSession都必须即时关闭,否则数据库连接池的活动资源少。
SqlSession提供了增删改查,使用mapper接口,其中有映射器,映射器作为一个动态代理,进入到mapperMethod的方法就能简单找到SqlSession的增删改查。其实就是通过动态代理记录,让接口跑起来,使用命令模式,最后采用sqlSession的方法执行sql语句。

2.3.2、什么时候会创建sqlSession?

普通Java项目

public class MybatisUtils {    
	public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}
-------------------------------测试方法------------------------------------------------
@Test
public void getUserById() {
    //工具类中获取SqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    try {
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        //执行查询方法getUserList
        User user = userDao.getUserById(1);
        /*打印*/
        System.out.println(1);
        User user2 = userDao.getUserById(1);
        System.out.println("2");

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        //关闭SqlSession
        sqlSession.close();
    }
}

由代码去决定什么时候更换sqlSession,所以你可以自己一直使用一个SqlSession

sprinboot

@Autowired
private UserMapper userMapper;

@Test
//    @Transactional
void contextLoads() {
    //参数是一个Wrapper , 条件构造器,这里我们先不用 --null
    //查询全部用户
    List<User> users = userMapper.selectList(null);
    List<User> us = userMapper.selectList(null);
    users.forEach(System.out::println);
    us.forEach(System.out::println);
}

没有给方法添加事务时:
每调用一次dao层的查询接口就会创建一个sqlSession,然后销毁一个sqlSession

在这里插入图片描述


给方法添加事务时
一个事务中,使用一个SqlSession,如图所示,第二次查询使用同一个sqlSession,然后缓存命中没有再次查询
在这里插入图片描述

2.3.2、SqlSession的实现类

在这里插入图片描述

  • 【DefaultSqlSession】
    是mybatis默认使用的实现类。这个类的线程是不安全的。所以每一个线程都要创建一个他自己有的sqlSession,所以不能把他设置成单例。
  • 【SqlSessionManager】
    线程安全
  • 【SqlSessionTemplate】
    SqlSessionTemplate是一个线程安全的类,当你运行一个sqlSessionTemplate时,会重新获取一个sqlSession,所有每一个方法都有独立的一个sqlSession,说明是线程安全的。

2.4、Executor执行器

mybatis一共有三个执行器

2.4.1、SimpleExecutor

每执行一次 update 或 select,就开启一个 Statement 对象,用完立刻关闭 Statement 对象。
所以这种会特别浪费性能,不合适使用。

2.4.2、ReuseExecutor

可重用处理器,执行 update 或 select,以 sql 作为 key 查找 Statement 对象,存在就使用,不存在就创建,用完后,不关闭 Statement 对象,而是放置于 Map<String, Statement>内,供下一次使用。简言之,就是重复使用 Statement 对象。

2.4.3、BatchExecutor

执行 update(没有 select,JDBC 批处理不支持 select),将所有 sql 都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()完毕后,等待逐一执行 executeBatch()批处理。与 JDBC 批处理相同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内

2.5、Mapper

Mapper是一个接口,没有任何实现类,作用是发送SQL返回需要的结果,或者执行SQL从而修改数据库的数据,因此应该在一个SqlSession事务方法之内,是方法基本的
在这里插入图片描述


3、mybatis的层次结构

在这里插入图片描述

SqlSession:作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
Executor:MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护

StatementHandler :封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。

ParameterHandler: 负责对用户传递的参数转换成JDBC Statement 所需要的参数,

ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;

TypeHandler :负责java数据类型和jdbc数据类型之间的映射和转换

MappedStatement: MappedStatement维护了一条<select|update|delete|insert>节点的封装,

SqlSource:负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回

BoundSql :表示动态生成的SQL语句以及相应的参数信息

Configuration:MyBatis所有的配置信息都维持在Configuration对象之中。

  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MyBatis 是一种基于 Java 的持久化框架,它的主要作用是简化与数据库的交互。MyBatis 工作原理如下: 1. 配置文件解析:MyBatis 配置文件是一个 XML 文件,它包含了数据库连接信息、Mapper 映射文件信息等。在 MyBatis 启动时,会将配置文件读取到内存中,并解析成相应的对象。 2. SqlSession 的创建:SqlSession 是 MyBatis 中用于与数据库进行交互的核心类,它封装了 JDBC 操作。在应用程序中需要执行 SQL 语句时,首先需要创建 SqlSession 对象。 3. Mapper 映射文件解析:Mapper 映射文件是 MyBatis 中用于定义 SQL 语句的 XML 文件,它包含了 SQL 语句、参数信息、返回值信息等。在 SqlSession 中执行 SQL 语句时,会根据 Mapper 映射文件中定义的 SQL 语句进行操作。 4. SQL 语句执行:当 SqlSession 接收到应用程序传递的 SQL 语句后,会根据 Mapper 映射文件中定义的 SQL 语句进行操作,包括 SQL 语句的解析、参数绑定、SQL 执行等。 5. 结果集映射:当 SQL 语句执行完毕后,MyBatis 会将查询结果映射成 Java 对象,并返回给应用程序。MyBatis 支持将结果集映射为单个 Java 对象、Java 对象列表、Map 等。 6. 事务管理:在 MyBatis 中,事务是通过 SqlSession 进行管理的。当应用程序需要执行一系列 SQL 语句时,可以通过 SqlSession 对象开启事务,执行完毕后再提交或回滚事务。 总的来说,MyBatis工作原理主要包括配置文件解析、SqlSession 的创建、Mapper 映射文件解析、SQL 语句执行、结果集映射和事务管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值