MyBatis的设计思想

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis的设计思想相关的知识,希望对你有一定的参考价值。

参考技术A

如果让我们自己设计一个MyBatis,那么最核心的思想是什么呢?

答案:JDK动态代理和反射

MyBatis的作用就是 调用一个Mapper接口的方法就相当于执行一条sql

1、MyBatis在SqlSession为给Mapper接口通过动态代理实现一个代理
2、在代理方法里面通过反射获取接口名称、方法名称、参数,拿这些数据后执行Executor的jdbc与sql交互的方法(这个才是真正去执行sql)
3、执行sql的结果集通过反射设置到Bean对象里面返回

注意 InvocationHandler 接口,这是proxy代理实例的调用处理程序实现的一个接口

mapper映射器其实就是一个动态代理对象,进入到MapperMethod的方法就能找到SqlSession的删除、更新、查询、选择方法,从底层实现来说:通过动态代理技术,让接口跑起来

首先根据命名空间,找出与mapper接口方法名相同的sql语句,然后交给sqlSession来执行。(这里用到反射)

《深入理解mybatis原理4》 MyBatis缓存机制的设计与实现

《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论。

MyBatis将数据缓存设计成两级结构,分为一级缓存、二级缓存:

   一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存。一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,可以通过开发插件对它进行修改);
?
  二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的生命周期一样,也就是说它的作用范围是整个Application应用。

MyBatis中一级缓存和二级缓存的组织如下图所示:

技术图片

一级缓存的工作机制:

  一级缓存是Session会话级别的,一般而言,一个SqlSession对象会使用一个Executor对象来完成会话操作,Executor对象会维护一个Cache缓存,以提高查询性能。关于一级缓存的详细实现,我已经在《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项 一文中有非常详尽的讨论,读者可以前去了解。

二级缓存的工作机制:

   如上所言,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSession对象创建Executor对象时,会对Executor对象加上一个装饰者:CachingExecutor,这时SqlSession使用CachingExecutor对象来完成操作请求。CachingExecutor对于查询请求,会先判断该查询请求在Application级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的Executor对象来完成查询操作,之后CachingExecutor会将真正Executor返回的查询结果放置到缓存中,然后在返回给用户。
?
MyBatis的二级缓存设计得比较灵活,你可以使用MyBatis自己定义的二级缓存实现;你也可以通过实现org.apache.ibatis.cache.Cache接口自定义缓存;也可以使用第三方内存缓存库,如Memcached等,这个我们会在后续的文章中详细讨论。

技术图片

由于缓存机制东西太多,所以将缓存机制的叙述拆成一下几部分(读者可点击查看):

  1. MyBatis的一级缓存实现详解 及使用注意事项

  2. MyBatis的二级缓存的设计原理

  3. 自定义二级缓存(未完,待续)

  4. 使用第三方内存库作为MyBatis的二级缓存(未完,待续)





以上是关于MyBatis的设计思想的主要内容,如果未能解决你的问题,请参考以下文章

《深入理解mybatis原理7》 MyBatis的二级缓存的设计原理

《深入理解mybatis原理1》 MyBatis的架构设计以及实例分析

Mybatis源码解析Mybatis源码中涉及的设计模式总结

《深入理解mybatis原理4》 MyBatis缓存机制的设计与实现

MyBatis缓存设计

《深入理解mybatis原理》 MyBatis的架构设计以及实例分析