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

java执行sql文件_Mybatis进阶笔记:架构概述与基本执行流程梳理

  1. Mybatis的架构概述
  2. 结合源码结构Mybatis的基本执行流程

一、Mybatis的架构概述

  1. Mybatis的架构概览如图所示:
9f49a58ef434081758b0dab7b41ce552.png

2.第一层:SQLsession,直接对外暴露,也是我们最常用的组件:

/p>

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

// 根据配置文件获取到SqlSessionFactory InputStream configFile = new FileInputStream("./src/main/resources/mybatis-conf.xml"); // 根据SqlSessionFactory获取sqlSession SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configFile); SqlSession sqlSession = sqlSessionFactory.openSession(); // 在sqlSession中获取Mapper SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class); // 执行SQL查询,获取结果 List sysUsers = mapper.queryList(); System.err.println(Arrays.asList(sysUsers));
793fe588bc2082eef862eeb799481e57.png

3.第二层:核心功能封装

  1. 配置parsing
  2. Parameter Mapping:查询条件的解析
  3. Sql Parsing:负责XxxMapper.xml或者基于注解(“@Select”等)的sql解析
  4. Executor:负责真正的SQL执行
  5. ResultSet Mapping:结果集映射
  6. Plugins:提供插件支持

4.第三层:最底层的功能

  1. 数据源:提供数据源支持
  2. 缓存:提供缓存支持
  3. Binding:负责将XxxMapper.java与XxxMapper.xml做双向绑定
  4. 日志:日志输出sql语句的执行日志,内部使用了代理模式,此处略加说明

1.抽象类是BaseJdbcLogger,同级包下有4个子类进行集成

91e26c7adcce3916eaf4fb3ffc38c730.png

2.以ConnectionLogger为例,各个Executor在执行sql之前获取到的connection,其实是connection的代理对象,通过代理类实现建立连接时的日志打印:

25d5b5dedc1ec0d1334833f94f1d5669.png

3.再通过配置项,实现对打印日志的开关控制:

b094ba40655ef8fe7bdb14186a685aad.png

4.资源加载

5.类型转换:负责将Java的数据类型与SQL的数据类型之间的互相转换

6.事务管理:Mybatis提供了轻量级的事务管理(很少用,实际项目使用时,通常将Mybatis集成到Spring,这种情况下,事务将由spring统一管理)

7.反射:封装了Java的反射方法作为工具类,起到了简化代码的作用

8.parsing:负责XxxMapper.xml或者基于注解(“@Select”等)的sql解析(以面向对象的思想来看待mybatis,XxxMapper.java是一个动作,对应的结果实体对应到实际的数据库表是一个名词)

ccd10bd81eccb69192942985261816b4.png

二、结合源码结构Mybatis的基本执行流程

1. 先说结论

  1. 再贴一下原生使用mybatis的示例代码(为了简单,只使用了一个xml配置文件,相关的Java代码都写在单元测试用,pom直接使用了mybatis.springboot.starter):
<?xml version="1.0" encoding="UTF-8" ?>
// 1. 读取配置文件 InputStream configFile = new FileInputStream("./src/main/resources/mybatis-conf.xml"); // 2. 根据配置文件获取到SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configFile); // 3. 根据SqlSessionFactory获取sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 4. 在sqlSession中获取Mapper SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class); // 5. 执行SQL查询,获取结果 List sysUsers = mapper.queryList(); System.err.println(Arrays.asList(sysUsers));

2.结论:

2. 结论验证:

  1. 第一步:加载配置文件到IO流;
InputStream configFile = new FileInputStream("./src/main/resources/mybatis-conf.xml");复制代码

2.第二步:解析配置文件;

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configFile);复制代码
  1. 这一步主要做的事情就是根据配置文件获取所有的Mapper.xml,从而获取Mapper接口类,并以Mapper接口类为键,对应的代理工厂对象为值,存储到一个Mapper容器(knownMappers)中。这一步整体的代码执行流程如下图所示:
62ea2b280dfd5fca4ab95c45df2522dd.png

3.第三步:获取sqlSession(此处暂不展开分析);

SqlSession sqlSession = sqlSessionFactory.openSession();

4.第四步:根据Mapper接口类获取实现类(动态代理生成的对象);

sqlSession.getMapper(SysUserMapper.class);

这一步就根据接口类,从之前的容器(knownMappers)中拿到对应的代理工厂对象,生成对应的代理对象并将其返回,这一步整体的代码执行流程如下:

d092978fe0d4fd1a612ffe583048c0d9.png

通过断点可以看到,最终拿到的对象实现类对象是一个代理对象

29ff613478a8182a3681fa6871244c50.png

5.第五步:调用Executor执行sql

List sysUsers = mapper.queryList();

相关文章:

  • catia二次开发_CATIA二次开发文件双手奉上,重命名非参后的CATPart
  • admin manager_Hadoop - 企业级大数据管理平台CDH(安装cloudera-manager)
  • python如何打印字符串_python 中 打印及格式化字符串的相关方法
  • selenium firefox驱动_[Selenium]2.开发环境配置
  • js regexp 匹配任意一个字符串_JavaScript基础知识:字符串的使用和基本操作
  • python列表的存储结构_3-Python内置结构-列表
  • 用python制作新用户注册系统_[宜配屋]听图阁
  • python中typeerror_Python中的TypeError类
  • python手工打码_打码兔和超人打码python版
  • python 将图片转换成像素画_Python用61行代码实现图片像素化
  • python实现自动翻页代码_python实现模拟按键,自动翻页看u17漫画
  • excel万年历_excel函数应用技巧:如何按不同要求,改变数值格式
  • python哪些领域_什么是Python?Python涉及哪些领域?
  • python 如何安装软件包故障_python中安装模块包版本冲突问题的解决
  • pythonand语法_python基础语法之and,or,not
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 07.Android之多媒体问题
  • iOS 颜色设置看我就够了
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • sessionStorage和localStorage
  • SpingCloudBus整合RabbitMQ
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 基于游标的分页接口实现
  • 聊聊sentinel的DegradeSlot
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 消息队列系列二(IOT中消息队列的应用)
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ###C语言程序设计-----C语言学习(6)#
  • #pragma 指令
  • #QT(TCP网络编程-服务端)
  • (C语言)逆序输出字符串
  • (NSDate) 时间 (time )比较
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)ORM
  • (转)setTimeout 和 setInterval 的区别
  • (转)创业的注意事项
  • (转)重识new
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net流程开发平台的一些难点(1)
  • .stream().map与.stream().flatMap的使用
  • @GlobalLock注解作用与原理解析
  • @ResponseBody
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [《百万宝贝》观后]To be or not to be?
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [java] 23种设计模式之责任链模式