MyBatis 简介:
MyBatis 是一个优秀的持久层框架,它对JDBC操作数据库的过程进行封装,使开发者只需要关注sql本身,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO(Plain Ordinary Java Object)映射成数据库中的记录,MyBatis 属于半自动的ORM框架。
MyBatis 使用:
MyBatis 的使用非常简单,在项目的 pom.xml 中引入 MyBatis 依赖即可。
<dependencies>
<!--mybatis依赖包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>
</dependencies>
MyBatis 主要组件
- Configuration:MyBatis所有的配置信息都维持在 Configuration 对象之中。
- SqlSessionFactory:Session 工厂。
- SqlSession:SqlSession 是 MyBatis 的顶层 API,主要负责和数据库的交互,完成数据的增删改查。
- Executor:Executor 是 MyBatis 的调度核心,负责 SQL 语句的生成和缓存的维护。
- StatementHandler:StatementHandler 是执行sql语句的核心类,负责创建和管理PreparStatment对象,执行sql语句并处理结果集。
- ParameterHandler:ParameterHandler 负责将参数转换为 JDBC 所需要的参数,。
- ResultSetHandler:ResultSetHandler 是处理 sql 语句返回结果集的接口,负责将结果集映射到 Java 对象。
- TypeHandler:TypeHandler 负责 Java 数据类型和 JDBC 数据类型之间的映射和转换。
- MappedStatement:MappedStatement 是映射文件中一条sql语句的映射信息,包括sql语句,参数映射信息,结果映射信息等,。
- SqlSource:SqlSource 负责将传递的 parameterObject 动态的生成为 SQL 语句,并将其封装到 BoundSql 中返回。
- BoundSql:表示动态生成的SQL语句以及相应的参数信息。
MyBatis 的工作流程
Mybatis 工作流程简图如下:
下面对每个节点进行简单分析:
- 读取 MyBatis 配置文件:加载 mybatis-config.xml 文件,加载 MyBatis 的运行环境等。
- 加载映射文件:映射文件即 mapper.xml 文件,文件中有 SQL 语句,需要在 MyBatis 的配置文件 mybatis-config.xml 中配置。
- 构造 SqlSessionFactory:通过 MyBatis 配置信息构建 SqlSessionFactory。
- 创建 SqlSession :通过 SqlSessionFactory 创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法,是一个既可以发送 SQL 执行并返回结果,也可以获取 Mapper 的接口。
- Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
- StatementHandler:用于封装 JDBC 中的 Statement 操作,即声明 sql、设置参数、执行sql等,执行器中每执行一次 SQL 操作,都会通过 Configuration 构建一个新的 StatementHandler,在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
- 输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
- 输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
MyBatis 的优缺点
优点:
- MyBatis 开源免费,社区活跃度高。
- 与 JDBC 相比减少了大量的代码,例如注册驱动、建立连接、关闭资源等。
- MyBatis 简单易学,学习成本低。
- MyBatis 简单灵活,支持各种动态 SQL,且 SQL 文件和业务代码分离,逻辑清晰且提高了代码的重用度。
- 提供丰富的标签,支持各种映射关系,例如对象和数据库字段的映射、一对一、一对多、多对多等。
缺点:
- 需要手动编写 SQL,SQL 编写工作量较大(MyBatis -Plus、TK-MyMyBatis 等 MyBatis 增强工具的使用可以减少 SQL 的编写),对开发人员的 SQL 功底有一定的要求。
- SQL 语句依赖底层数据库,整体可移植性不高。
- 缓存使用不当,容易产生脏数据,后面会详细介绍 MyBatis 一二级缓存。
总结:本篇简单概括 MyBatis 的概念及一些核心组件,并没有去讲解怎么去使用 MyBatis,大部分小伙伴都有使用过 MyBatis,且有很多文档去讲解怎么使用 MyBatis,感觉再次去讲怎么使用 MyBatis 有些多余 。
欢迎提出建议及对错误的地方指出纠正。