热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mybatis源码学习笔记(二)之Mybatis核心原理流程分析

1文章开始之前的几句闲话做任何事情,我们都需要有自己的思考跟想要达到的目标,人的内心就像是湖面的倒影一样,总是飘忽不定且言不由衷ÿ




1 文章开始之前的几句闲话

    做任何事情,我们都需要有自己的思考跟想要达到的目标,人的内心就像是湖面的倒影一样,总是飘忽不定且言不由衷,我们要学会让自己的心安静下来,湖面总会归于平静,最终你总还是会看清自己。同样在学习源码的时候,我们也是要有一个主线,带着思考去学习,不能盲目拎不清,什么都想看,但是自己一点儿脑筋都不动肯定不行的,我们每天射箭,可是如果连箭靶子都看不清,那每天拉弓有什么意义?
    学而不思则惘,思而不学则殆,与君共勉。


2 Mybatis的使用流程简述


  • 创建maven项目,导入Myabtis框架依赖
  • 在项目的resources目录下创建mybatis-config.xml全局配置文件
    • 在项目的resources创建数据库连接参数配置文件jdbc.properties
    • 在mybatis-config.xml文件中的properties标签中引入jdbc.properties配置文件
    • 在setting标签中配置设置LogImpl、VfsImpl、二级缓存启停等参数设置
    • 在typeAliases标签下的自定义别名设置
    • 在environment标签下配置数据库连接信息、数据源及事务管理器相关信息
    • 在mappers标签下配置Mapper.xml文件的映射扫描方式及扫描路径
    • 其他标签以及以上标签具体的参数配置及配置方法参考https://mybatis.org/mybatis-3/zh/
  • 创建实体类
  • 创建mapper层的Mapper接口
  • 在项目的resources目录下创建mapper层接口包路径相同的目录结构,在该目录下创建mapper对应的*Mapper.xml
  • 创建测试类进行mapper层方法测试

3 Mybatis整体结构

在这里插入图片描述


3.1 接口层


  • 接口层就是其他应用和Mybatis框架交互的入口, 在这个层面最重要得对象就是SqlSession。
  • 大家之前肯定学习过JDBC, JDBC的核心也是要创建出这个SqlSession对象用来跟数据库进行交互,Mybatis框架以JDBC为核心进行了封装和扩展。
  • SqlSession上定义了非常多的对数据库的操作方法。接口层在接收到调用请求的时候,会调用核心处理层的相应模块来完成具体的数据库操作

3.2 核心处理层

核心处理层主要完成对数据库操作(增删改查)。
核心处理层主要完成以下功能:


  1. 把接口中传入的参数解析并映射成JDBC类型;
  2. 解析接口注解(@Select/@SelectProvider/@Insert/@InsertProvider/@Update/@UpdateProvider/@Delete/@DeleteProvider)或者*Mapper.xml文件中的SQL语句,包括输入参数和动态SQL的生成;
  3. 执行SQL语句;
  4. 获取默认及自定义拦截器进行处理
  5. 处理SQL语句执行完毕后的ResultSet结果集,并映射成Java对象。

3.3 基础支撑层

基础支持层主要是一些抽取出来的通用功能(实现复用),用来支撑核心处理层的功能。例如类型转换、接口方法与代理对象的映射关系绑定、缓存、日志、xml解析、反射工具类、IO、事务、数据源等功能。


4 Mybatis的核心流程

我们从业务层面去分析一下Mybatis的核心流程, 这里写一个简单的的查询示例代码

SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
try (InputStream ins = Resources.getResourceAsStream("mybatis-config.xml")){
SqlSessionFactory factory = factoryBuilder.build(ins);
SqlSession sqlSession = factory.openSession();
LibBookMapper mapper = sqlSession.getMapper(LibBookMapper.class);
List<LibBook> libBooks &#61; mapper.selectAllBook();
libBooks.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}

把上面的代码翻译成执行流程


  • 1.先创建了一个SqlSessionFactoryBuilder对象用来获取SqlSessionFactory对象
  • 2.读取全局配置文件mybatis-config.xml转成文件流
  • 3.调用SqlSessionFactoryBuilder对象构建SqlSessionFactory对象的方法&#xff0c;传入全局配置文件流对象&#xff0c;获取到SqlSessionFactory对象
  • 4.通过SqlSessionFactory对象的openSession方法获取到Sqlsession对象
  • 5.调用Sqlsession的getMapper(Class calzz)方法获取到接口对应的代理类对象
  • 6.执行借口中对应的方法获取到查询结果

绘制成流程图大致如下
在这里插入图片描述


5 具体核心流程阅读前的疑问


  • 1、全局配置文件mybatis-config.xml文件是怎么解析的&#xff1f;解析出来的对象都保存到了那里&#xff1f;这些对象又是怎么被用到后面的流程中去的&#xff1f;
  • 2、*Mapper.xml文件是怎么完成解析的&#xff1f;解析出来的对象保存在哪里&#xff1f;它们又是怎么和JAVA定义的Mapper接口进行映射绑定的&#xff1f;
  • 3、如果我们在定义接口方法的时候使用的是&#64;Select/&#64;Insert/&#64;Update/&#64;Delete等注解&#xff0c; 没有使用xml文件的映射方式&#xff0c;注解方式的映射是怎么解析的&#xff1f;
  • 4、如果使用的是xml文件映射的方式&#xff0c;这些xml文件是什么时候被载入解析的&#xff0c; 解析完成之后的对象都是怎么存储的&#xff1f;后续的流程中他们又是怎么被使用到的&#xff1f;
  • 5、接口方法中的输入参数是JAVA中的数据类型&#xff0c;怎么映射处理成对应数据库中的对应的数据类型的&#xff1f;
  • 6、不管是注解还是xml映射文件&#xff0c;SQL语句是怎么解析的&#xff1f;如果SQL语句中包含参数&#xff1f;在SQL语句执行之前&#xff0c;这些占位符中的参数肯定被替换成具体的参数值了&#xff0c;这个
    操作是在哪里完成的&#xff1f;涉及到多个参数的占位符替换&#xff0c;每个参数的类型都不相同&#xff0c; 怎么保证参数值替换占位符的时候不会出现错误的&#xff1f;
  • 7、接口方法中的返回值类型和SQL语句执行完毕返回的ResultSet结果集中的返回值类型是如何实现映射的&#xff1f;在返回ResultSet对象之后&#xff0c;Mybatis是如何把它处理成Java对象的&#xff1f;
  • 8、数据库连接对象是什么时候创建的&#xff0c;是一开始就创建了麽&#xff0c;创建数据库连接对象一定要使用连接池麽? 使用连接池和不使用连接池&#xff0c;Myabtis都是如何处理的&#xff1f;
  • 9、Mybatis中的事务控制是如何实现的&#xff1f;
  • 10、Mybatis的三级缓存的实现原理是怎样的&#xff1f;在具体的代码中是怎么体现的&#xff1f;
  • 11、Mybatis插件的实现原理&#xff0c;如何自定义插件?自定义插件如何在mybatis中使用并生效&#xff1f;
  • 12、源码肯定会使用设计模式&#xff0c; Mybatis框架中都是用了哪些设计模式&#xff1f; 都体现在代码中的哪些地方&#xff1f;
  • 13、Spring框架是如何整体Mybatis的&#xff1f;实现原理是什么&#xff1f;

后面的文章&#xff0c; 我会一点一点儿的说明我在源码中找到的关于以上问题的答案的&#xff0c;如果对我的文章感兴趣&#xff0c;请多关注&#xff0c;如果阐述有问题&#xff0c; 请多指正~







推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
author-avatar
手机用户40405729304
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有