MyBatis到底是什么?(新手必看)
本节首先会介绍什么是 ORM、什么是 MyBatis、MyBatis 的特点以及核心概念,最后介绍 MyBatis 是如何启动、如何加载配置文件的。
当我们开发应用程序时,需要编写大量的数据访问层代码,用来操作数据库中的数据,这些代码要么是大量重复的代码,要么操作特别烦琐。针对这些问题,ORM 提供了完善的解决方案,简化了将对象持久化到关系数据库中的操作。
ORM 框架的本质是简化编程中操作数据库的编码,Java 领域发展到现在,ORM 框架层出不穷,但是,基本上还是 Hibernate 和 Mybatis 两个比较流行并被广泛使用:
Hibernate 宣称可以不用写一句 SQL,而 MyBatis 以动态 SQL 见长,两者各有特点,开发者可以根据需求灵活使用。有一个有趣的现象:传统企业大多喜欢使用 Hibernate,而互联网行业则通常使用 MyBatis。
MyBatis 支持定制化的 SQL、存储过程和高级映射,能够非常灵活地实现动态 SQL,可以使用简单的 XML 或注解来配置和映射原生信息,能够轻松地将 Java 的 POJO(Plain Ordinary Java Object,普通的 Java 对象)与数据库中的表和字段进行映射关联。
MyBatis作为一款使用广泛的开源软件,它的特点如下:
早期的 Mapper 接口需要自定义去实现,现在 MyBatis 会自动为 Mapper 接口创建动态代理对象。Mapper 接口的方法通常与 Mapper 配置文件中的 select、insert、update、delete 等 XML 节点一一对应。
具体的工作流程如下图所示:

图 1 MyBatis 的启动流程
总结起来,MyBatis 主要有两大核心组件,分别是 SqlSessionFactory 和 Mapper。SqlSessionFactory 负责创建数据库会话,Mapper 主要提供 SQL 映射。
什么是ORM
ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。简单地说,ORM 通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中。当我们开发应用程序时,需要编写大量的数据访问层代码,用来操作数据库中的数据,这些代码要么是大量重复的代码,要么操作特别烦琐。针对这些问题,ORM 提供了完善的解决方案,简化了将对象持久化到关系数据库中的操作。
ORM 框架的本质是简化编程中操作数据库的编码,Java 领域发展到现在,ORM 框架层出不穷,但是,基本上还是 Hibernate 和 Mybatis 两个比较流行并被广泛使用:
- Hibernate:全自动的框架,强大、复杂、笨重、学习成本较高;
- Mybatis:半自动的框架(需要开发者了解数据库),必须要自己写 SQL。
Hibernate 宣称可以不用写一句 SQL,而 MyBatis 以动态 SQL 见长,两者各有特点,开发者可以根据需求灵活使用。有一个有趣的现象:传统企业大多喜欢使用 Hibernate,而互联网行业则通常使用 MyBatis。
什么是MyBatis
MyBatis 是一款优秀的数据持久层 ORM 框架,被广泛地应用于应用系统。最早是 Apache 的一个开源项目 iBatis,2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为 MyBatis,2013 年 11 月又迁移到了 GitHub。MyBatis 支持定制化的 SQL、存储过程和高级映射,能够非常灵活地实现动态 SQL,可以使用简单的 XML 或注解来配置和映射原生信息,能够轻松地将 Java 的 POJO(Plain Ordinary Java Object,普通的 Java 对象)与数据库中的表和字段进行映射关联。
MyBatis作为一款使用广泛的开源软件,它的特点如下:
- 易学易用,没有任何第三方依赖;
- SQL 被统一提取出来,便于统一管理和优化;
- SQL 和代码解耦,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试;
- 灵活动态的 SQL,支持各种条件来动态生成不同的 SQL;
- 提供映射标签,支持对象与数据库的 ORM 关系映射;
- 提供对象关系映射标签,支持对象关系组件维护。
MyBatis的核心概念
MyBatis 由 Mapper 配置文件、Mapper 接口、执行器、会话等组件组成。下面就来介绍这些非常重要的组件和概念。1) Mapper配置文件
Mapper 配置文件可以使用基于 XML 的 Mapper 配置文件来实现,也可以使用基于 Java 注解的 MyBatis 注解来实现,甚至可以直接使用 MyBatis 提供的 API 来实现。2) Mapper接口
Mapper 接口是指自定义的数据操作接口,类似于通常所说的 DAO 接口。早期的 Mapper 接口需要自定义去实现,现在 MyBatis 会自动为 Mapper 接口创建动态代理对象。Mapper 接口的方法通常与 Mapper 配置文件中的 select、insert、update、delete 等 XML 节点一一对应。
3) Executor(执行器)
MyBatis 中所有 SQL 语句的执行都是通过 Executor 进行的,Executor 是 MyBatis 的一个核心接口。4) SqlSession(会话)
MyBatis的关键对象,类似于 JDBC 中的连接(Connection),SqlSession 对象完全包含数据库相关的所有执行 SQL 操作的方法,它的底层封装了 JDBC 连接,可以用 SqlSession 实例来直接执行被映射的 SQL 语句。5) SqlSessionFactory(会话工厂)
MyBatis 的关键对象,它是单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory 对象的实例可以通过 SqlSessionFactoryBuilder 对象类获得。6) SqlSessionFactoryBuilder构建器
用于解析配置文件,包括属性配置、别名配置、拦截器配置、数据源和事务管理器等,可以从 XML 配置文件或一个预定义的配置实例进行构建。MyBatis的启动流程
MyBatis 的使用虽然简单,但是,它属于高度封装的框架,因此,我们必须熟悉 MyBatis 的启动和执行过程。具体的工作流程如下图所示:

图 1 MyBatis 的启动流程
- 加载 Mapper 配置的 SQL 映射文件,或者注解的相关 SQL 内容;
- 创建会话工厂。MyBatis 通过读取配置文件的数据源信息来构造会话工厂(SqlSessionFactory);
- 创建会话。MyBatis 可以通过会话工厂来创建会话对象(SqlSession),会话对象是一个接口,该接口中包含对数据库操作的增、删、改、查方法;
- 创建执行器。因为会话对象本身不能直接操作数据库,所以它使用了一个叫作数据库执行器(Executor)的接口来帮它执行操作;
- 封装 SQL 对象。在这一步,执行器将待处理的 SQL 信息封装到一个对象(MappedStatement)中,该对象包括 SQL 语句、输入参数映射信息(Java简单类型、HashMap或POJO)和输出结果映射信息;
- 操作数据库。拥有了执行器和 SQL 信息封装对象就可以使用它们访问数据库,最后返回操作结果,结束流程。
总结起来,MyBatis 主要有两大核心组件,分别是 SqlSessionFactory 和 Mapper。SqlSessionFactory 负责创建数据库会话,Mapper 主要提供 SQL 映射。