什么是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手动配置实体属性与表配置关系来实现。
相关推荐
就叫_这个吧8 小时前
Java+MySQL+Mybatis+Junit4实现学生信息管理系统
java·mysql·mybatis
噢,我明白了11 小时前
MyBatis-Plus 中IPage的分页查询
java·mybatis
basketball61612 小时前
Redis基础:3. Redis 持久化(重要)
redis·bootstrap·mybatis
Knight_AL14 小时前
MyBatis 报错:Parameter ‘xxx‘ not found 的原因与解决方案
java·tomcat·mybatis
我登哥MVP15 小时前
Spring Boot 从“会用”到“精通”:Converter 原理
java·spring boot·servlet·maven·mybatis·converter
XiYang-DING1 天前
【MyBatis】${}与 #{}的区别
java·tomcat·mybatis
sxlishaobin1 天前
SpringBoot集成MyBatis的SQL拦截器实战
spring boot·sql·mybatis
我登哥MVP1 天前
Spring Boo从“会用”到“精通”:Spring Boot 入门
java·spring boot·后端·spring·maven·intellij-idea·mybatis
浮游本尊2 天前
Day 2 :POST `/plan/save` 保存链路 + MyBatis 写操作
mybatis
cheems95272 天前
[开发日记]Spring Boot + MyBatis-Plus 抽奖系统排障实录:从 JWT 被拦截到雪花 ID 失控,我是怎样一步步修通登录与人员列表的
spring boot·后端·mybatis