前言
周五本来想着跑个步就打算睡觉来着,没想到还能跟前同事大佬在一起交流一波技术(其实是单方面的吊锤我,哈哈),大佬带我系统的分析了几个常见框架的源码,今天正好趁热,赶紧把已经了解的内容记录下来,便于以后进行查阅
ORM
在正式了解mybatis之前,其实需要先了解一些概念,比如什么是ORM(Object Relational Mapping,简称ORM)
wikipedia
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
阮一峰的网络日志《ORM实例教程》
在面向对象编程语言当中,所有的实体都可以被视作对象,而关系数据库当中,则是通过实体与实体间的关系来连接数据,很早就有人提出,关系也可以用对象来表达,这样的话,就可以通过面向对象的思想来操作关系型数据库。
也就是说,ORM是通过实例对象的语法,来完成关系型数据库操作的技术。
- 数据库中的表 —》 类
- 数据库中的一行记录 —》 对象
- 字段 —》 对象的属性
在Java编程语言中,常用的ORM框架无非两种,一种是Hibernate,一种是Mybatis,前一种是拥抱面向对象的,它能够维护Object—> Relation和 Relation —> Object的映射,是完整的ORM框架,而Mybatis则不是这样,mybatis只实现了Relation—> Object这一部分内容,它是拥抱SQL的,所以说Hibernate是完整的ORM框架,而Mybatis是不完整的ORM框架,Hibernate这种接近面向对象的操作方式也使得它拥有一系列的优点(HQL语言),但是由于经常使用HQL语言容易使得对底层SQL的细节忽略,从而导致一些SQL在出现性能问题后优化会非常困难,由于本节只讲mybatis,所以hibernate和mybatis的对比区别这里就不再过多赘述了。
mybatis框架的工作流程
由于现阶段用springboot比较多,我们现在就拿集成已经非常方便的mybatis-spring-boot-starter来进行本文的讲解,代码版本
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
其实一聊到springboot,想到的第一件事就应该是自动装配,那就需要看一下mybatis是不是有mybatisAutoConfigration,果然这里有自动配置类-》org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
MybatisAutoConfiguration配置类在当前环境下如果发现DataSource类加载后,会进行自动装配,默认会加载SQLSessionFactory和SqlSessionTemplate,
SqlSessionFactory是生产SqlSession的工厂,可以创建Sqlsession(mybatis核心接口,通过这个接口可以执行命令,获取mapper或者是管理事务)
SqlsessionTemplate则实现了Sqlsession、DisposableBean接口,在构造方法内创建了一个代理SqlSessionInterceptor,通过该代理类代理执行statement
sqlsession提供的接口方法
sqlsessionTemplate类图