首页 > 编程语言 >Mybatis 源码(二):整体设计概览

Mybatis 源码(二):整体设计概览

时间:2023-03-10 15:22:21浏览次数:50  
标签:SqlSessionFactory 核心 概览 SqlSession 源码 SQL Mybatis

1、Mybatis整体架构

  Mybatis的整体框架分为三层,分别是基础支持层、核心处理层、和接口层。

 

1.1、接口层

  SqlSession是接口层的核心对象,是应用程序与Mybatis交互的桥梁。SqlSession接口定义数据查询、数据新增、数据修改、数据删除等对数据库库操作的方法。也定义了获取数据库连接、事务提交/回滚、资源关闭、缓存处理等方法。

  SqlSession接口方方法:

    

  接口层在接收到调用请求的时候,会调用核心处理层的相应模块来完成具体的数据库操作。

1.2、核心处理层

  核心处理层主要处理与数据库相关的操作。核心处理层功能的设计思想与笔记(二):JDBC的封装中提到原生JDBC封装思想一样,主要完成以下事情:

  1、输入参数解析,映射成JDBC类型;

  2、解析SQL语句,动态生成数据库可执行的SQL;

  3、执行SQL;

  4、输出参数解析,映射成实体对象。

1.3、基础支持层

  基础支持层主要支持核心处理层的工作,将通用功能进行封装实现复用。基础支持层包含数据源、事务、缓存、日志等功能。

    

2、Mybatis执行核心流程

1.1、Mybatis执行代码示例

  引用Mybatis 源码(一):源码编译准备中的代码示例分析Mybatis的核心执行流程

 1 public static void main(String[] args) throws IOException {
 2         String resource = "mybatis-config.xml";
 3         // 加载mybatis的配置文件
 4         InputStream inputStream = Resources.getResourceAsStream(resource);
 5         // 获取sqlSessionFactory
 6         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         // 获取sqlSession
 8         SqlSession sqlSession = sqlSessionFactory.openSession();
 9         // 查询用户
10         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
11         User user02 = mapper.selectUserById("101");
12         System.out.println("user01: " + user02);
13     }
14 }

1.2、执行示例中的核心对象

1、SqlSessionFactoryBuiler

  SqlSessionFactoryBuiler是用来构建SqlSessionFactory的,SqlSessionFactory只需要一个,也就是说只要成功构建SqlSessionFactory,SqlSessionFactoryBuiler就没什么用了,SqlSessionFactoryBuiler的作用域只存在方法内部。

2、SqlSessionFactory

  SqlSessionFactory是用来创建SqlSession的,每次应用程序访问数据库,都需要创建一个会话。因为一直有创建会话的需要,所以SqlSessionFactory应该存在于应用的整个生命周期中(作用域是应用作用域)。

创建SqlSession只需要一个实例来做这件事就行了,否则会产生很多的混乱,和浪费资源。采用采用单例模式。

3、SqlSssion

  SqlSession是一个会话,线程不安全,线程之间不能共享。请求过来就创建SqlSession对象,在请求完成后关闭。作用域在一次请求中。

4、Mapper

  Mapper是从SqlSession中获取的,是一个代理对象,用于发送SQL来操作数据库的数据。作用域在一个SqlSession事务方法之内。

1.3、核心执行流程

  Mybatis的核心流程图如下:

                  

1、配置解析

  读取Mybtais的全局配置文件mybatis-config.xml、Mapper.xml映射文件,包含数据库连接信息,事务管理器、数据源、SQL映射文件等配置。配置解析源码分析:Mybatis 源码(三):Mybatis配置解析,核心流程图如下;

       

2、构建会话工厂SqlSessionFactory

  配置解析完成之后,返回了一个DefaultSqlSessionFactory,持有配置类Configuration的实例。

3、创建sqlSession对象(Executor执行器)

  由会话工厂创建SqlSession对象,创建sqlSession对象的核心是创建Executor执行器,Executor对象中包含了执行DML语句的所有方法。

  sqlSession对象创建源码分析:Mybatis 源码(五):SqlSession对象构建。核心流程图如下:

                   

5、SQL执行流程

  SQL执行流程源码分析:Mybatis源码(七):SQL执行流程。核心流程图如下:

                 

标签:SqlSessionFactory,核心,概览,SqlSession,源码,SQL,Mybatis
From: https://www.cnblogs.com/RunningSnails/p/17203449.html

相关文章

  • Mybatis-lesson3-万能MAP-2023-3-10
    如果实体类或数据库中太多参数,我们应该考虑用MAPintaddUser2(Map<String,Object>map);Mapper.xml<insertid="addUser2"parameterType="map">insertinto......
  • 视频直播源码,前端canvas动态验证码实现
    视频直播源码,前端canvas动态验证码实现  //生成一个随机数  constrandomNum=(min:number,max:number)=>{    returnMath.floor(Math.random()*......
  • Mybatis+Oracle 返回自增字段值
    <insertuseGeneratedKeys="true"keyProperty="id"keyColumn="id"></insert>#useGeneratedKeys需要数据库本身支持字段自增的<insertid="insertUser"parameterTyp......
  • mybatis实现数据库批量插入两种方式
    一、一次插入多个对象<insertid="addList">      insertintouser      (name,age,mobilephone,sex,birthday,email)values      <foreac......
  • mybatis 缓存机制
    #1、mybatis的缓存--减少和数据库的交互降低数据库压力#2、缓存机制原理第一次sql查询的时候将结果缓存(保存内存中),下一次sql查询与第一次相同,如果缓存有数据直接从缓......
  • Mybatis-lesson1-2023-3-10
    第一步:maven依赖搭建,同时把build内容加上。避免后期丢失的问题<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"......
  • 一行一行源码分析清楚 AbstractQueuedSynchronizer(二)
    文章比较长,信息量比较大,建议在pc上阅读。文章标题是为了呼应前文,其实可以单独成文的,主要是希望读者看文章能系统看。本文关注以下几点内容:深入理解ReentrantLock公......
  • 多渠道兑换系统源码
    该多渠道兑换系统源码源码采用前后端分离模式开发,前端使用Vue+Element 后端采用Asp.netCore 可扩展对接任意支付,支持网关下发,Web通信下发,Sql下发等方式  ......
  • Mybatis学习日志
    查询user表中所有数据1,创建user表,添加数据  2,创建模块,导入坐标 3,编写MyBatis核心配置文件-->替换链接信息解决编码问题4,编写SQL映射文件-->统一管理sql语句,解......
  • centos stream9 源码安装 amule 2.3.3
    下载amule源码cdaMule-2.3.3mkdirbuild-kuncdbuild-kun../configure缺少依赖zlibsudodnfinstallzlib-devel重复执行../configure缺少wxwidgets从源代码......