Mybatis工作原理

主要介绍SqlSession组件的创建过程,包括Mybatis框架对XPath方式解析XML封装的工具类,SqlSessionFactoryBuilder、SqlSessionFactory 和 SqlSession。

一、SqlSession创建过程

使用 MyBatis 的主要 Java 接口就是 SqlSession。通过这个接口来执行SQL命令,获取映射器和管理事务。首先要了解如何获取一个 SqlSession 实例SqlSessions SqlSessionFactory 实例创建的。SqlSessionFactory 对象包含创建 SqlSession 实例的所有方法SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的,它可以从 XML、注解或手动配置 Java 代码来创建 SqlSessionFactory

1.1. SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 有五个 build() 方法,每一种都允许从不同的资源中创建一个 SqlSession 实例。

SqlSessionFactory build(InputStream inputStream) 

最常用,使用一个参照了 XML 文档或更特定的 mybatis-config.xml 文件的 Reader 实例。可选参数是 environment 和 properties。environment 决定加载哪种环境,包括数据源和事务管理器。

SqlSessionFactory build(InputStream inputStream, String environment)

如果调用了参数有 environment 的 build 方法,那么 MyBatis 将会使用 configuration 对象来配置这个 environment。当然,如果你指定了一个不合法的 environment,你就会得到错误提示。如果你调用了不带 environment 参数的 build 方法,那么就使用默认的 environment。

SqlSessionFactory build(InputStream inputStream, Properties properties)    /   SqlSessionFactory build(InputStream inputStream, String env, Properties props)

如果调用了参数有 properties 实例的方法,那么 MyBatis 就会加载那些 properties(属性配置文件),并在配置中可用。那些属性可以用${propName} 语法形式多次用在配置文件中。如果一个属性存在于这些位置,那么 MyBatis 将会按照下面的顺序来加载它们:首先读取在 properties 元素体中指定的属性;其次,读取从 properties 元素的类路径 resource 或 url 指定的属性,且会覆盖已经指定了的重复属性;最后,读取作为方法参数传递的属性,且会覆盖已经从 properties 元素体和 resource 或 url 属性中加载了的重复属性。

SqlSessionFactory build(Configuration config)

最后一个 build 方法的参数为 Configuration 实例。configuration 类包含你可能需要了解 SqlSessionFactory 实例的所有内容。Configuration 类对于配置的自查很有用,它包含查找和操作 SQL 映射(当应用接收请求时便不推荐使用)。作为一个 Java API configuration 类具有所有配置的开关

1.2. SqlSessionFactory

SqlSessionFactory 有六个方法创建 SqlSession 实例。通常来说,当你选择这些方法时你需要考虑以下几点:

1事务处理:需要在 session 使用事务或者使用自动提交功能(auto-commit)吗?(通常意味着很多数据库JDBC 驱动没有事务)

2连接:我需要依赖 MyBatis 获得来自数据源的配置吗?还是使用自己提供的配置?

3执行语句:我需要 MyBatis 复用预处理语句和/或批量更新语句(包括插入和删除)吗?

基于以上需求,有下列已重载的多个 openSession() 方法供使用。

SqlSession openSession()

SqlSession openSession(boolean autoCommit)

SqlSession openSession(Connection connection)

SqlSession openSession(TransactionIsolationLevel level)

SqlSession openSession(ExecutorType execType,TransactionIsolationLevel level)

SqlSession openSession(ExecutorType execType)

SqlSession openSession(ExecutorType execType, boolean autoCommit)

SqlSession openSession(ExecutorType execType, Connection connection)

Configuration getConfiguration();

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

2.会开启一个事务(也就是不自动提交)。

3.从当前环境配置的 DataSource 实例中获取 Connection 对象。

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

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

这些方法大都是可读性强的。向 autoCommit 可选参数传递 true 值即可开启自动提交功能。若要使用自己的 Connection 实例,传递一个 Connection 实例给 connection 参数即可。还有一个参数就是 ExecutorType,这个枚举类型定义了三个值:

ExecutorType.SIMPLE:这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。

ExecutorType.REUSE:这个执行器类型会复用预处理语句。

ExecutorType.BATCH:这个执行器会批量执行所有更新语句,如果 SELECT 在它们中间执行,必要时请把它们区分开来以保证行为的易读性。

1.3. SqlSession

SqlSession 类中有超过 20 个方法,所以将它们组合成易于理解的分组。

Mybatis主配置文件解析生成Configuration对象的过程。

SqlSession执行Mapper过程

    Mapper接口注册过程,SQL配置转换为MappedStatement对象并注册到Configuration对象的过程。

    除此之外,本章还介绍了通过SqlSession执行Mapper的过程。

动态SQL实现原理

    Mybatis动态SQL的使用,动态SQL配置转换为SqlSource对象的过程,

    以及动态SQL的解析原理,最后从源码的角度分析动态SQL配置中#{}${}参数占位符的区别。

https://www.jianshu.com/p/83d8237107a1

二、SqlSession执行Mapper过程

主要分为Mapper接口的注册过程、MappedStatement对象的注册过程、Mapper方法的调用过程、SqlSession执行Mapper的过程。

2.1 Mapper接口的注册过程

复制代码
@Test
    public  void testMybatis () throws IOException {
        // 获取配置文件输入流
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        // 通过SqlSessionFactoryBuilder的build()方法创建SqlSessionFactory实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 调用openSession()方法创建SqlSession实例
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取UserMapper代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 执行Mapper方法,获取执行结果
        List<UserEntity> userList = userMapper.listAllUser();
        System.out.println(JSON.toJSONString(userList));
    }
复制代码

创建SqlSession实例后,需要调用SqlSession的getMapper()方法获取一个UserMapper的引用,然后通过该引用调用Mapper接口中定义的方法。UserMapper是一个接口,我们调用SqlSession对象getMapper()返回的是什么?接口中定义的方法必须通过某个类实现,然后创建该类的实例,才能通过实例调用方法。所以SqlSession对象getMapper()返回的是某个类的实例,实际返回的是一个动态代理对象。Mybatis中通过MapperProxy类实现动态代理。

posted @   雨也飘柔  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示