首页 > 其他分享 >简单全面的mybatis详解

简单全面的mybatis详解

时间:2023-11-10 19:32:12浏览次数:27  
标签:语句 MyBatis 配置文件 映射 全面 详解 SQL mybatis 解析

1、前言

MyBatis是一款ORMObject-Relational Mapping)框架,其主要用于将Java对象与关系数据库之间进行映射,凭借其轻量性、稳定性以及广泛的开源社区其受到了广大开发者的追捧。

MyBatis为我们做了哪些事情呢?其实,总结来看主要有如下几点:

  1. SQL映射配置MyBatis使用XML或注解配置文件来定义SQL查询、插入、更新和删除操作,以及与数据库表之间的映射关系。这使得开发者能够将SQL语句与Java代码分离,提高了代码的可维护性。
  2. 动态SQLMyBatis支持动态SQL,允许根据不同的条件生成不同的SQL语句。这使得构建复杂的查询变得更加灵活和方便。
  3. 参数映射MyBatis能够将Java对象的属性与SQL语句中的参数进行映射,无需手动编写繁琐的参数传递代码。
  4. 结果集映射MyBatis支持将SQL查询结果映射到Java对象,自动将数据库表中的列值赋给Java对象的属性,大大简化了数据的读取和处理。
  5. 事务管理MyBatis可以与Java的事务管理框架(如Spring)无缝集成,确保数据库操作的原子性和一致性。
  6. 连接池集成MyBatis可以与常见的Java连接池库(如Apache DBCP、C3P0、HikariCP)集成,以管理数据库连接的获取和释放。
  7. 二级缓存MyBatis支持二级缓存,可以在多个会话之间共享数据,提高性能。

2、总览MyBatis

对于Mybatis的架构大致可以分为三层:基础支持层核心处理层接口层。

首先,使用MyBatis概括来看大致包括如下几步:

  1. 定义接口,配置相关的xml文件信息
  2. 加载接口的配置文件,解析相关配置文件
  3. 生成接口代理类,执行相关sql

由于在使用MyBatis过程中会编写相关的配置文件,所以Mybatis内部必然需要相应组件来支撑配置文件的解析,这些也就构成了底层的基础支撑层。既然会解析配置文件,那就必然会涉及到资源加载、配置解析模块.

进一步,当配置文件解析完成后,下一步就是生成代理,然后执行sql,此时所涉及的也就是核心处理层中的sql执行,sql解析等。更进一步,执行sql过程中为了避免Connection频繁创建,需要对连接进行池化操作, 所以MyBatis内部会抽象出一个数据源模块来统一管理连接。

除此之外,对于sql执行过程中的事务也需要控制, 所以MyBatis还有事务管理模块来对sql执行过程中的事务进行管理。

事实上,你只需要记住Mybatis的使用过程为:定义接口,提供配置文件,而后生成代理,执行Sql 即可。以此进行发散,自然而然能扩展出上图所示内容,根本没必要死记硬背。

熟悉了MyBatis的整体架构后,我们接下来看Mybatis内部执行sql的大致流程:

简单全面的mybatis详解_配置文件

接下来,我们将主要围绕这张图中内容进行总结分析。

3、配置文件解析

配置文件解析过程大致如下所示:

简单全面的mybatis详解_SQL_02

事实上,MyBatis内部对于配置文件解析的过程可以概括如下:

  1. 加载配置文件:MyBatis首先加载主配置文件(通常是mybatis-config.xml),并创建一个Configuration对象来表示整个MyBatis配置。
  2. 解析主配置文件:MyBatis使用XML解析器解析主配置文件,该文件包含了关于数据源、插件、类型别名、缓存等全局配置信息。这些配置会被存储在Configuration对象中。

而参与配置文件解析的都继承与BaseBuilder,其体系结构如下所示:

简单全面的mybatis详解_SQL_03

其中

  1. XMLStatementBuilder :这个类用于解析映射文件中的 <select><insert><update> 和 <delete> 等标签,构建与 SQL 语句相关的对象(如 MappedStatement),包括 SQL 语句的解析、参数映射、结果映射等。
  2. XMLMapperBuilder :XMLMapperBuilder 用于解析映射文件(通常是 Mapper.xml 文件),负责构建与映射文件相关的对象,包括映射文件的解析、SQL 语句的构建、参数映射、结果映射、缓存配置等。
  3. XMLConfigBuilder :XMLConfigBuilder 用于解析主配置文件(通常是 mybatis-config.xml 文件),负责构建与全局配置相关的对象,包括数据源配置、类型别名配置、插件配置、缓存配置等。

总结来看,对于MyBatis的加载过程来说,其在处理配置文件信息时,首先,会传递配置文件所在位置信息,然后再调用框架提供的****SqlSessionFactorybuild方法便会根据传入路径信息去加载相关的配置文件,并进行解析。而解析的内容会存放到的configuration之中,进而方便后续组件的使用。

4、代理构建

当配置文件解析,下一步就是通过SqlSessiongetMapper方法来构建一个接口对应的代理类,这一过程大致如下:

简单全面的mybatis详解_mybatis_04

这一过程中涉及的组件主要包括MapperProxyFactory、MapperRegistry、MapperProxy,这一过程的本质就是通过Jdk动态代理的方式返回一个实现接口的实例对象

5、sql执行

当配置文件解析完成,接口相应的代理类构建完毕后,下一步要做的就是sql的执行,这一过程逻辑大致如下所示:

简单全面的mybatis详解_SQL_05

这一部分的底层逻辑就是原生JDBC操纵数据库的那一套逻辑,即

  1. 创建SQL语句:即创建StatementPreparedStatementCallableStatement对象,分别用于执行不同类型的SQL语句。
  2. 执行SQL查询:使用创建的StatementPreparedStatement对象来执行SQL查询。
  3. 处理查询结果:通过ResultSet对象来处理查询的结果数据。

6、总结

最后,我们再来一下Mybatis内部对于sql执行的大致步骤:

  1. 创建 SqlSessionFactory:使用Mybatis首先需要创建一个 SqlSessionFactory 对象,这通常通过读取MyBatis 的主配置文件(mybatis-config.xml)并使用 SqlSessionFactoryBuilder 来实现。SqlSessionFactory 负责创建数据库连接和 SqlSession 对象。
  2. 创建 SqlSession:通过 SqlSessionFactory 创建一个 SqlSession 对象。SqlSession 代表了与数据库的一次会话,它可以执行 SQL 操作并管理数据库连接。通常,每个线程都会创建自己的 SqlSession
  3. 执行 SQL 语句:在 SqlSession 中,通过调用方法执行 SQL 语句。MyBatis 支持多种方式来执行 SQL,包括 selectOne()selectList()insert()update()delete() 等方法。
  4. SQL 语句解析MyBatis 会解析 SQL 语句,包括动态 SQL,参数映射和结果映射。这包括了将 Java 对象转化为 SQL 语句中的参数,以及将查询结果映射回Java对象。
  5. 执行 SQL :MyBatis 将 SQL 语句发送到数据库,并执行相应的操作,如查询、插入、更新或删除。数据库返回结果或受影响的行数,这取决于SQL语句的类型。
  6. 处理结果MyBatis 最终会将SQL的执行结果映射为 Java 对象,然后返回给调用者。映射过程通常基于映射文件中的配置。结果集的处理包括将数据库查询结果映射为 Java 对象的属性值。

进一步,上述步骤可总结概括总结为如下的流程。

简单全面的mybatis详解_Java_06

标签:语句,MyBatis,配置文件,映射,全面,详解,SQL,mybatis,解析
From: https://blog.51cto.com/u_14355911/8307021

相关文章

  • Maven详解
    一.前言   以前做过的项目中,没有真正的使用过Maven,只知道其名声很大,其作用是用来管理jar包的。最近一段时间在项目过程中使用Maven,用Maven构建的web项目,其项目结构只停留在了解阶段,没有深入的使用与理解,刚好最近看了一篇关于Maven的详解;就开始深入学习一下Maven的具体应用。......
  • JAVA分布式详解
    分布式系统是由多个独立的计算机(或计算节点)通过网络连接组成的系统,这些计算机共同工作以完成某个任务。在Java中,有许多工具和框架可以帮助开发者构建分布式系统。以下是一些与Java分布式系统相关的重要概念、技术和框架:JavaRMI(RemoteMethodInvocation):JavaRMI是一种用于创建分......
  • C++字符串详解
    C++大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的string类。string类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。string是C++中常用的一个类,它非常重要,我们有必要在此单独讲解一下。使用string类需要包含头文件<string>,......
  • helm 详解
    helm定位为包管理工具   ......
  • 详解uiautomator2,让你摆脱usb
    https://blog.csdn.net/weixin_52040868/article/details/119883498工具太多了,却发现都不好用,难道没有一个好用且顺畅的工具吗。本章就来给你说说这个神器,不需要每次刷新界面,实时元素定位,环境配置简单。当然,本章之前,前面所说的不论是工具,还是元素定位方式方法,还是必须要掌握的,技......
  • Cocos Creator中Sprite组件使用详解
    在CocosCreator游戏开发中,Sprite组件是非常重要的组件之一,也是使用最频繁的组件之一。因此,必须对其非常熟悉。Sprite组件简介1:游戏中显示一个图片,通常我们把这个叫做”精灵”sprite2:cocoscreator如果需要显示一个图片,那么需要在节点上挂一个精灵组件,为这个组件指定要......
  • Mybatis-Plus 使用隐患,太坑了!
    作者:糊涂码链接:https://juejin.cn/post/7156428078061895710前言MP从出现就一直有争议感觉一直都存在两种声音like:很方便啊通过函数自动拼接Sql不需要去XML再去使用标签之前一分钟写好的Sql现在一秒钟就能写好简直不要太方便dislike:侵入Service层不好维护可......
  • SATA硬件驱动器接口的可制造性问题详解
    SATA接口是硬盘与主机系统间的连接部件,作用是在硬盘缓存和主机内存之间传输数据。不同的硬盘接口,决定着硬盘与计算机之间的连接速度,在整个系统中,硬盘接口的优劣,直接影响着程序运行快慢和系统性能好坏。SATA接口介绍SATA(SerialATA)是串行ATA的缩写,是一种完全不同于并行ATA的新型......
  • Unity3D 如何基于addressable来做资源管理详解
    前言Unity3D是一款非常流行的游戏开发引擎,其强大的功能和易用性使其成为了众多游戏开发者的首选。在游戏开发中,资源管理是一个非常重要的方面,而Unity3D提供了一种名为Addressable的功能,可以帮助开发者更好地管理和加载游戏资源。本文将详细介绍如何基于Addressable来进行资源管理......
  • 实现MyBatisPlus自定义sql注入器
    目标:新增mysql下的插入更新的语法INSERTINTO%s%sVALUES%sONDUPLICATEKEYUPDATE%s新增方法类,新增的方法名称为insertOrUpdate和insertOrUpdateBatch方法,但其mapper层的方法名为insertOrUpdate方法importcom.baomidou.mybatisplus.annotation.IdType;importcom.b......