什么是 MyBatis?为什么要学 MyBatis?

在很久以前我就想要写一些有关于框架的文章了,MyBatis 是我最早学习并上手的一个框架,也想了很久 MyBatis 应该从哪里开始写起。

我们认识一件事物,都是从他的定义,他的作用这两方面开始认识的。也就是:是什么?为什么?再深入怎么做

因此 MyBatis 这篇文章,我也将从**是什么?为什么要用 MyBatis?**开始讲起。否则,我们就不知道我们使用 MyBatis 的意义何在了

那么你为什么要学 MyBatis 呢?

也许很多人和我一样,因为市面上流行的都是 SSM 框架,同时市面上的免费/付费教程都使有关 MyBatis 的,因此也紧跟潮流与大多数人一起学了 MyBatis。

那么究竟为什么 MyBatis 这么流行,大家都在用,他的优点在哪,又有哪些不足的地方?我们先来看什么是 MyBatis

什么是MyBatis

来自于百度和官方文档的定义

  • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
  • MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

这些也许已经是老生常谈了,但是该了解的我们依旧有必要重复一下。因为这个系列是以 MyBatis 的源码分析为主,如果大家对 MyBatis 的使用还有不了解的地方,这里推荐几个学习方式

MyBatis 的使用教程

  • 官方文档:https://mybatis.org/mybatis-3/zh/getting-started.html
  • 狂神说老师的教程:https://www.bilibili.com/video/BV1NE411Q7Nx
  • 江南一点雨的教程:http://mybatis.javaboy.org

为什么我们需要 MyBatis

我们需要一门新技术,肯定是原来的技术无法满足我们的需求所致。因此,我们需要先查看一下原来 JDBC 的实现方式是怎样的。

原生 JDBC 连接

我们先看看最基础的通过 JDBC 查询数据库,一般需要7个步骤

  • 加载 JDBC 驱动
  • 建立并获取数据库的连接
  • 创建 JBDC Statements 对象
  • 设置 Sql 语句的传入参数
  • 执行 Sql 语句并获取查询结果
  • 对查询结果进行转换并将处理结果返回
  • 关闭资源或连接

在这几个流程中,JDBC 存在着一些问题,或者是一些执行流程能够做高度封装, MyBatis 都做出了解决方式。

1、Sql 语句的统一存取

对于 JDBC 而言,Sql 语句的编写存在以下的问题:

  • 1、Sql 语句都在 Java 类中,不易于维护
  • 2、改动 Sql 语句需要重新编译、部署

MyBatis 的解决方法

  • 1、不将 Sql 语句写入 Java 代码中,而是统一存放到 xml 文件
  • 2、Sql 语句以 key - value 的形式存放,通过 key 值获取对应的 Sql 语句

2、动态 Sql

对于 JDBC 而言,动态 Sql 的获取存在以下问题

  • 1、后台需根据传入的参数拼接字符串,造成资源的浪费
  • 2、参数的不确定,有时候传入一个参数,有时候传入两个参数

MyBatis 的解决方法

  • 1、将动态参数存入集合类
  • 2、通过这样的标签来判断参数的传入情况
  • 3、使用 # 变量名 # 来动态解析传入的参数

3、结果映射

对于 JDBC 而言,结果映射存在以下问题

  • 每次 JDBC 执行 Sql 语句之后,返回的是一个 ResultSet 集合,我们需要及时将对象取出,否则一旦释放资源就无法读取信息了。
  • 无法提前获知返回的结果,获取结果后需进行进一步处理

MyBatis 的解决方法

  • 在 xml 文件中,我们使用 resultType 来作为 Sql 语句的返回类型
  • 对SQL执行结果的缓存来提升性能,缓存数据时 key - value 格式

4、解决 Sql 语句重复问题

在写 JDBC 的时候经常会在多个 Java 类中调用差不多的 Sql 语句,甚至是同一个 Sql 语句。有时候如果需要改表的字段,就要对很多个类进行修改。

MyBatis 的解决方案

将 Sql 语句放到 xml 文件中,则需要用到的时候就调用 Sql 语句的 key 调用,则不会产生 Sql 语句的重复问题。

MyBatis 的优点与不足

同样作为持久层的开源框架,MyBatis 不免要被拿来与 Hibernate、JPA 相比。

映射关系

  • Hibernate、JPA 是将实体类(pojo)和数据库表进行了关联,是完整的ORM框架。
  • MyBatis 将 Dao 接口与 Sql 语句进行关联,本质上是 Sql 映射

使用情况

  • Hibernate、JPA 可以自动生成 Sql 语句,可以降低使用成本,在进行数据库移植时,代价也会更小,因此更加稳定;但也有弊端,就是缺乏灵活性,也不易对 Sql 语句进行优化,毕竟是自动生成的。

  • 反观 MyBatis,虽然无论多简单的语句都需要手写 Sql 语句,使得使用成本大大增加;但灵活性也就更强,也提供了改动和优化 Sql 语句的机会。此外,MyBatis 还提供了插件机制,用户可以按需自定义插件。

  • 国情也占了一部分原因。在国内,一个系统的需求需要经常性做修改,数据库的字段也会不断更新,因此就需要更加灵活多变的框架。这是 MyBatis 在国内更流行的原因。

  • 同时,MyBatis 的学习成本更低,更小巧方便。

当然,MyBatis - Plus 在 MyBatis 的基础上进行了单表操作的封装,让 MyBatis 的开发更加简单了,这是后话了。

后续还会有更精彩内容,欢迎关注公众号:林枍。学习Java基础、数据结构、流行框架