什么是MyBatis

MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。以下是关于MyBatis的详细介绍:

一、MyBatis的起源与发展

  • MyBatis本是Apache的一个开源项目iBATIS,2010年这个项目由Apache迁移到了Google Code,并且改名为MyBatis。2013年11月迁移到Github。
  • 当前,最新版本是MyBatis 3.5.13,发布时间是2023年03月11日。

二、MyBatis的功能特点

  • 简单易学:MyBatis本身很小且简单,没有任何第三方依赖。最简单的安装只需两个jar文件,并配置几个SQL映射文件。它易于学习、易于使用,通过文档和源代码,开发者可以比较全面地掌握其设计思路和实现。
  • 灵活:MyBatis不会对应用程序或者数据库的现有设计强加任何影响。SQL写在XML里,便于统一管理和优化。
  • 解除SQL与程序代码的耦合:MyBatis通过提供DAO(数据访问对象)层,将业务逻辑和数据访问逻辑分离,使得系统的设计更清晰、更易维护、更易进行单元测试。
  • 支持对象与数据库的ORM字段关系映射:MyBatis提供映射标签,支持对象关系映射(ORM),方便Java对象与数据库记录之间的转换。
  • 支持动态SQL:MyBatis提供XML标签,支持编写动态SQL,使得SQL语句更加灵活、可配置。

三、MyBatis的核心组件与流程

MyBatis架构分为三层:

  • API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层接收到调用请求后,会调用数据处理层来完成具体的数据处理。
  • 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它的主要目的是根据调用的请求完成一次数据库操作。
  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理等。这些都是共用的组件,为上层的数据处理层提供最基础的支撑。

MyBatis的执行流程如下:

  1. 加载配置并初始化:触发条件为加载配置文件。处理过程是将SQL的配置信息加载成为一个个MappedStatement对象(包括传入参数映射配置、执行的SQL语句、结果映射配置),并存储在内存中。

  2. 接收调用请求:触发条件为调用MyBatis提供的API。传入参数为SQL的ID和传入参数对象。处理过程是将请求传递给下层的请求处理层进行处理。

  3. 处理操作请求:触发条件为API接口层传递请求过来。传入参数为SQL的ID和传入参数对象。具体处理步骤包括:

    • 根据SQL的ID查找对应的MappedStatement对象。
    • 根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
    • 获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
    • 根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
    • 释放连接资源。
  4. 返回处理结果:将最终的处理结果返回。

四、MyBatis的配置与使用

  • 导入依赖:使用MyBatis需要导入MyBatis和数据库(如MySQL)的依赖。
  • 配置yml或xml文件:配置数据库连接信息、MyBatis的相关设置等。
  • 创建Mapper接口:定义数据访问方法。
  • 创建Mapper XML文件:编写SQL语句,并与Mapper接口中的方法绑定。
  • 使用SqlSession进行操作:通过SqlSession获取Mapper接口的代理实现类,并调用其方法进行数据库操作。

五、MyBatis的高级特性

  • 一级缓存:存储在SqlSession中,默认开启。第一次查询时会先去缓存中查找,若找到则直接返回;若没找到则去数据库获取,返回查询结果并缓存。事务提交操作会清空缓存。
  • 二级缓存:构建在一级缓存之上。在收到查询请求时,MyBatis会首先查询二级缓存;若二级缓存未命中,再去查询一级缓存;若一级缓存也没有,则查询数据库。二级缓存与具体的命名空间绑定,一个Mapper中有一个Cache,相同Mapper中的MappedStatement共用一个Cache。
  • 延迟加载:MyBatis支持延迟加载,即只有在真正需要数据时才从数据库中加载,这有助于提高性能。
  • 复杂映射:MyBatis支持复杂映射,包括一对一、一对多、多对多等关系映射。这可以通过resultMap手动配置实体属性与表配置关系来实现。
相关推荐
麻瓜code1 小时前
双写一致性:为什么是“删缓存“,而不是“改缓存“
java·缓存·mybatis
郭小李20 小时前
mybatis 动态 sql
java·sql·mybatis
知守观21 小时前
技术考古:iBATIS 2.3.4 时代的持久层,是如何用 Map 玩转 307 个存储过程的?
java·后端·mybatis
captain37621 小时前
MyBatis Plus(1)
java·服务器·mybatis
代码不停1 天前
MyBatis进阶
spring boot·mybatis
captain3762 天前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
captain3762 天前
MyBatis(进阶1)
mybatis
郭小李2 天前
mybatis的 Mapper.xml语法
xml·java·mybatis
m0_639906942 天前
MyBatis 实现分页查询|逻辑分页、物理分页、PageHelper 原理
mybatis
captain3763 天前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis