什么是 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基础、数据结构、流行框架