1.Mybatis的工作原理
1.MyBatis 是支持普通 SQL查询,存储过程和高级映射的持久性框架。
2.MyBatis使用XML用于配置和映射,将接口和 Java 的数据结构映射成数据库中的记录。
2.Mybatis框架的优缺点
优点:
1. 与直接JDBC相比,减少了代码量。
2. 简单易学,能够快速上手应用
3.基于原生SQL,使用灵活,不会对象数据库的现有设技产生影响。SQL语句通过XML文件 进行维护,与程序代码解耦,便于统一管理优化,并可方便重用
4. 支持编写动态SQL语句,与代码解耦 。
5.支持java对象属性与查询结果集字段的映射(ORM)
缺点:
1.SQL语句的编写工作量较大
2.不能方便地更换数据库
3.阅读Mybatis源码
Configurtion类是整个Mybatis框架运行的核心配置,包含所有Mapper,别名,SQL等信息
XMLConfigBuilder是一个解析核心配置的解析类;
parse()解析并封装所有核心配置和Mapper信息得到一个ConfigBuilder对象
创建了一个解析器
解析完parser.parse()返回一个Configurtion对象
typeAliasRegistry是所有类型别名的注册表,包括java语言本身的类型别名,业务实体类的别名
MapedStatement是对所有SQL语句的封装
resultMaps保存了所有解析到的<resultMap>节点
MappedStatement保存了所有解析到的<select><insert><delete><update>等SQL节点
MappedRegistry保存了所有的Mapper接口,以及对应的代理工厂
一级缓存:又叫本地缓存,为SqlSession/Statement级别(localCacheScope控制)。默认打开。
二级缓存:又叫全局缓存,为Mapper级别。第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放代该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。默认打开,但需要XML中<cache> 标签配合。【缓存命中率】
开启二级缓存,执行查询的是缓存执行器CachingExecutor,但是缓存
执行器只是去查询一下缓冲有没有数据,没有就委托给SimpleExecutor去执行数据库查询[装饰者模式]
mybatis缓存是本地缓存,也就是说可能造成A机器修改了,但是B机器还是用缓存的脏数据问题,因此在分布式/集群项目架构中使用不多。