您的位置:首页 > 编程语言 > Java开发

mybatis源码解析以及执行的流程

2018-01-03 18:18 543 查看
以往总是看别人的源码解析,也曾几何时希望自己能静下心来了解一下底层的东西,但终久没有行动起来。可能的原因我总结有以下几点:

1.底层的代码需要大量的时间来仔细的阅读和揣摩。

2.技术受限制,包括不知道怎么阅读和真的看不懂底层的代码以及设计思想。

对于以上问题,我的应对方法是:

1.时间,我们总能挤出来,比如我,在公司上午看源码,下午写公司需求(提升技术,公司也是乐意)

2.技术受限这种,我觉得只能通过经验的积累,这个短时间真的没办法解决。

3.不知道怎么阅读,这确实让人头疼,因为还没开始,我们就认输了,这乃大忌。我的解决方式是,结合书本(这次是借助深入浅出mybatis源码),在结合源代码,进行一步一步的查看。

4.设计思想,其实指的就是设计模式,以及设计模式的6大原则,这个需要多看设计模式(如果你不是天才,一定要坚信,书读百遍,其义自见)

接下来就简单记录一下自己所学到的一点知识点:

-------------------------------------------------------------

首先,还是贴一下mybatis官网给出的对于mybatis的定义:

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java
Objects,普通的 Java对象)映射成数据库中的记录。

说的很清楚,我们用mybatis其实最简单说就是以面向对象的方式操作数据库,并把获取到的数据进行java对象的映射。

下面我们看下mybatis源码包结构:



一看这么多包可能我们已经头晕了,而我还没说每个包下又有十几到几十个类文件。然而我们只需要了解一些重要的类即可,其他的

要么是辅助类,要么是不用的类。在这里我就记录一下对一些重要类的简单了解:SqlSession,Configuration,DefaultSqlSessionFactory

,Reflector,MappedStatement,Executor,MapperProxy等。

首先我们来讲解一下SqlSession:



操作数据库的接口类。此类通过SqlSessionFactory的openSession方法创建,利用工厂模式进行创建,而工厂的创建是通过SqlSessionFactoryBuilder创建的。SqlSessionFactoryBuilder是单利模式,根据配置信息创建工厂,由于配置信息是我们提前设置好的,不会改动,实例化一次就行了。



这个是SqlSessionFactoryBuilder里的所有方法,箭头指出最重我们用到的SqlSessionFactory的工厂实是DefaultSqlSessionFactory

而创建,截取一个方法的图片:



需要Configuration这个配置类初始化的配置信息,初始化Configuration的是XMLConfigBuilder进行文件流的读取:



接下来我们看下使用方法:



其实现类是DefaultSqlSession,查询一个对象我们看看更底层的实现简单序列图:



对于sqlSession能完成查询的工作,但是在实际的开发中,我们并未用到他,而是用到了mapper原因看过一些资料有两个,第一:面向对象,第二:可以
基于注解实现零配置。
mybatis基于mapper接口的形式操作数据库,其底层还是调用的sqlsession,是怎么做到的呢?这里用到了动态代理,何为动态代理呢?代理的话,还好理解,打个比方你在淘宝买的东西,到了,你没办法接受,你可以让附近的菜鸟物流接受,你在有空的时候去拿就可以了。这种模式有一个弊端过于单一,而动态代理,不管代理对象是什么,有可能是菜鸟物流,有可能随便一个人,只要你能通过短信找到这个人拿到东西就可,这就灵活多了。
对于动态代理,mybatis的实现是基于java的反射和cglib来实现的,java 的反射只能解决基于接口的类型,而基于实体类的需要cglib生成一个子类进行调用。下面看一个java的反射的例子。
获取Mapper 是通过



底层的实现,是通过configuration获取到的,mapper是基于接口的,执行需要用代理执行,所以核心代码:





下面的逻辑就是sqlsession去执行的事了。

mybatis的知识点就先到这,接下来后期还会继续更新这块的知识点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息