当前位置: 首页 > news >正文

Mybatis架构,SqlSessionFactory源码分析

下一篇:SqlSession源码分析

1. Mybatis架构

  •  接口层:增加接口方法,删除、修改、查询、各种直接使用的配置方法
  • 数据处理层:参数处理(处理parameterType的参数)、SQL解析(解析器)、SQL执行(通过Executor对象)、处理结果(resultType或者resultMap返回的结果)
  • 框架支撑层:事务管理(<transactionManager>标签)、缓存机制(<settring name="cacheEnabled">)、连接池管理(environment标签中的<dataSource>)
  • 引导层:SQL语句的方式:XML配置或注解方式

2. Mybatis中步骤

  1. 获取SqlSessionFactory对象
  2. 获取SqlSession对象
  3. 获取xxxMapper对象-》代理接口的方法,也可以是代理mapper.xml中的<select>标签
  4. 执行<select>标签定义的sql语句

 1. SqlSessionFactory源码分析

2. 

进入build()方法,返回值是一个parser.parse()对象

 

 所以是通过一个parse()解析器返回对象

 进入parse()方法可以看到,返回的是一个Configuration对象

 看看parse()方法是如何返回Configuration对象的,里面有parseConfiguration()方法解析configuration对象

 

Mybatis配置文件中的标签如下:里面的typeAliases、environments、mappers配置信息同上

 

配置文件中的标签,全部通过parseConfiguration()方法解析,选一个settingsElement方法进入,看看如何解析settings标签的

 进入以后可以看到,我们在settings标签中配置的缓存和延迟加载等属性都保存在了一个configuration对象

 刚刚看了settingsElement()方法,再看看怎么解析mapper的mapperElement()方法

 

不是package,看看XMLMapperBuilder对象的parse()方法

 

进入mapperParser.parse()方法,

 

parse()方法有个configurationElement()方法

 

 看看configurationElement()方法

 进入buildStratemetnFromContext()方法,看看如何分析select等标签

先分析select标签有没有databaseId属性

 

如果mapper.xml文件select标签的databaseId不为空,调用buildStatementFromContext(list,this.configuration.getDatabaseId())方法

 

 

 进入parseStatementNode()方法,该方法把mapper文件的配置信息,封装为String类型的数据:id,datdabaseId,.....

所以<select id= "" resultType=""等属性是通过parseStatementNode()解析

 

 进入addMappedStatement()方法

 =》Mybatis会将Mapper.xml文件中的<select>等标签解析成MappedStatement对象

所以MappedStatement对象就是<select><insert><delete><update>标签

 MappedStatement存在于Configuration中、environment(mybatis-config.xml文件配置信息)也是Configuration的属性

 可以得出结论:所有配置信息、增删改查标签 全部存在于Configuration中

Configuration又存在于DefaultSqlSessionFactory对象中(SqlSessionFactory)

 所以SqlSessionFactory对象——>DefaultSqlSessionFactory——>Configuration——>包含了一切配置信息

相关文章:

  • java输入输出流
  • Python 数组控件的使用
  • 为什么 Facebook 不使用 Git?
  • Java中单例设计模式详解
  • 杰理695的UI模式LED灯控制
  • Golang | Leetcode Golang题解之第52题N皇后II
  • 也谈AIGC和ChatGPT的区别?
  • 论文阅读-CheckFreq:频繁、精细的DNN检查点操作。
  • IP 电话
  • 设计模式——策略模式
  • Java+SpringBoot+Vue+MySQL:美食推荐系统的技术革新
  • [Docker 教学] 常用的Docker 命令
  • 我终于读懂了设计模式的七大原则。。。
  • stm32f4xx-SPI
  • 高数(下) 第十二章:无穷级数
  • LeetCode·每日一题·940.不同的子序列 || · 动态规划
  • 【云原生】Elasticsearch + kibana on k8s 讲解与实战操作
  • 神经网络过拟合什么意思,神经网络中解决过拟合
  • win11toast:python桌面通知工具
  • 【cloud Alibaba】(四)分布式事务处理——Seata
  • [算法入门笔记] 19. 有序表
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • Java反射小练之手写BeanUtils的copyProperties(Upgrade)
  • 软件测试过程:单元测试,集成测试,系统测试,验收测试,回归测试
  • 入门力扣自学笔记177 C++ (题目编号:769)
  • QT中QThread的各个方法,UI线程关系,事件关系详解(5)
  • 深度学习:LeNet-5实现服装分类(PyTorch)
  • 核酸系统架构设计
  • 基于Matlab模拟、检测和跟踪飞机着陆进场中异常的仿真(附源码)
  • 面试官:服务端推送到Web前端有哪几种方式?
  • selenium使用篇_键盘鼠标事件
  • Java第17章 - I/O流(一)