Mybatis框架梳理
- 前言
- 1.ORM
- 2.模块划分
- 2.1 ORM的实现
- 2.2 SQL的映射
- 2.3 插件机制
- 2.4 缓存机制
- 2.5 其他
- 2.5.1 用到的设计模式
- 3. 愿景
前言
如果让我聊一聊mybatis,我该怎么说呢?开发中时时刻刻都在用它,此时此刻,脑海中却只浮现ORM框架这几个字,再努力回想一下:通过MapperProxy动态代理完成mapper接口的查询,还有呢?哪怕能说出来,应该也是磕磕巴巴。
我想起了学生时代做题的日子,看到题目就知道它考哪个点,从哪些刁钻的角度去考…大抵还是不熟悉或者对mybatis没有清晰的脉络,所以当需要对外产出的时候,才会东一点西一点,想到哪里说哪里。
这也是我写博客的本意,希望通过不断地反问和梳理,加深自己对某个技术点的理解。后面会一个模块一篇文章分别去记录。
1.ORM
MyBatis它是什么?它是一个半ORM的持久层框架。
持久层框架,这个很好理解,在需要对数据进行持久化存储的时候,MyBatis帮我们简化了持久化的过程。
那什么是ORM,半ORM又是什么呢?
首先要知道什么是ORM,什么是ORM框架,然后再来说为什么说mybatis是半ORM框架。
ORM全称Object-Relational Mapping,也就是对象关系的映射。这里的关系映射是指对象的属性与关系数据库中对应的表字段之间的关系映射。在面向对象的编程语言中,万物皆是对象,而ORM的作用就是负责建立对象属性与表字段之间的映射,修改表数据的某个字段直接变成更新对象的某个属性,极大简化了开发。
知道了ORM,那么ORM框架的作用就呼之欲出了。要知道,框架嘛,肯定不止是帮我们完成关系映射这么一个功能,在我们编码过程中,ORM直接帮我们屏蔽了数据库层面,我们只需要操作对象就可以操作数据库,而不用编写SQL。比如Hibernate,我们可以通过定义方法名称来控制SQL的执行逻辑,比如selectByName,selectByAge…
那么如果我的某个方法逻辑比较复杂,需要自定义SQL呢,这时就需要说说一Mybatis了。
用过spring-JPA的都懂,那种令人发指的简便,用它和Mybatis对比来说明半ORM再好不过。之所以说Mybatis是半ORM框架,因为它也使用ORM中表字段和对象属性的这种映射来简化开发,但又没有完全屏蔽数据库层,允许开发者自定义SQL操作数据库。也正因为这种半ORM的设计,使用Mybatis在自定义SQL方法有极大的灵活性。
2.模块划分
知道了MyBatis的半ORM框架的特性,这种认识太笼统宽泛了,笼统到听到的人表面“好好好”,内心想抽你。
那么它有哪些核心的特性可以让它一直被广泛使用,又是如何实现这些特性的呢。稳住,莫慌!先简单回想一下,在平时使用Mybatis的过程中,用到了它的哪些功能。在不看源码的情况下,可以通过这些直观的功能对Mybatis进行简单的模块划分,做到心中有数。
- 首先肯定是ORM:对象属性与数据库字段的自动映射,它怎么做的?
- SQL的映射:就写了个
mapper接口
和同名的xml文件
,也没有实现类,怎么就直接查询了呢?- 插件:分页插件都用过,还有一些自定义的拦截功能,怎么实现的?
- 缓存:Mybatis内置了缓存的支持
上述功能是日常开发中普遍能接触使用的,最能直观感受Mybatis的功能模块划分。从这些模块入手,日常开发中的使用案例可以帮助我们更直观的理解Mybatis的功能实现和设计思想。至于其他模块如日志、配置等,学完这些后也不会很难。
2.1 ORM的实现
为了防止
畏难情绪
劝退(劝退我自己,我担心写不下去O_o
),从最简单的关系映射
的实现开始梳理吧。
2.1MyBatis——ORM对象关系映射
2.2 SQL的映射
聊一聊Mybatis中的动态代理和SQL的映射过程
2.2Mybatis——代理与SQL映射
2.3 插件机制
JDK的代理机制如何实际运用?弄懂Mybatis插件机制的原理,相信你对JDK动态代理会有新的认识和理解。
2.3MyBatis——插件机制
2.4 缓存机制
日常开发中,我们使用缓存的方式:
- 使用JDK提供的集合将数据缓存在JVM中;
- 使用中间件将数据缓存在内存中。
而Mybatis的两级缓存设计刚好使用了这两种方式。
2.4Mybatis——缓存机制
2.5 其他
2.5.1 用到的设计模式
-
工厂模式
Mybatis——SqlSessionFactoryBuilder工厂模式 -
模板方法模式:在执行 SQL 操作时,Executor 类提供了执行逻辑的模板,具体的 SQL 操作在 StatementHandler 中定义。
-
策略模式:MyBatis 中的参数处理、结果映射等使用了策略模式。不同的处理逻辑(如不同的 ParameterHandler 和 ResultSetHandler)可以根据需要灵活切换。
-
适配器模式:在不同的数据库或不同的 JDBC 驱动程序之间,MyBatis 通过适配器模式来统一接口。
3. 愿景
从提纲挈领的模块划分,到局部核心功能点的实现细节,希望自己的一些理解和梳理,能够帮助小伙伴们理解mybatis并构建自己的知识体系。