mybatis 原理分析

一.mybatis的作用

大家都懂的

二.spring项目中使用mybatis

1.需依赖的maven包

mybatis 原理分析_第1张图片
2.如何使用

大家都会
使用mybatis-generator-core.jar以及configfile生成对应的文件,包括
xxxEntity, xxxExample,xxxMapper,xxxMapper.xml。
使用注意点:
确保xxxMapper.xml中的namespace和sql id 同 xxxMapper路径和方法名保持一致对应。

三.spring - mybatis 框架的执行过程

1.sqlSessionFactory启动初始化
mybatis 原理分析_第2张图片
说明:
SqlSessionFactoryBean 负责构建Configuration,收集各种配置信息,包括各种xxxMapper.xml以及datasource,plugins等。
SqlSessionFactoryBuild利用configuration生成sqlSessionFactory,并有spring容器托管;
主要源码:
SqlSessionFactoryBean中buildSqlSessionFactory的过程
mybatis 原理分析_第3张图片
configuration中关键的mappedStatements

2.xxxMapper 接口的实现类
mybatis 原理分析_第4张图片

其中SqlSessionTemplate是spring-mybatis的核心,实现了SqlSession接口。
SqlSessionTemplate调用getMapper方法,通过configuration对象,传递给MapperProxyFactory,创建MapperProxy对象,即为xxxMapper接口的实现代理实现类。
主要源码:
MapperRegistry调用MapperProxyFactory
mybatis 原理分析_第5张图片

MapperProxyFactory执行过程
mybatis 原理分析_第6张图片

SqlSessionTemplate实例
mybatis 原理分析_第7张图片

3.CRUD操作mybatis 原理分析_第8张图片

以xxxMapper.selectByExample()方法调用为例,方法被拦截,进行代理类的invoke方法
mybatis 原理分析_第9张图片

接下来交给mapperMethod处理
mybatis 原理分析_第10张图片

SqlCommand里面存储了本次操作的MapperStatement,通过反射,查询configuration的mapperStatements表获得。

mapperMethod交给sqlSessionTemplate处理,sqlSessionTemplate调用统一的代理方法,然后交给DefaultSqlSession处理,
mybatis 原理分析_第11张图片

DefaultSqlSession交给CachingExecutor处理,CachingExecutor再交给BaseExecutor处理(先查缓存,再查数据库)
mybatis 原理分析_第12张图片

最后交给SimpleExecutor,执行jdbc操作
mybatis 原理分析_第13张图片

四.mybatis的事务管理

mybatis本身的事务工厂有两种类型
JdbcTransactionFactory 和 ManagedTransactionFactory,分别创建JdbcTransaction
和ManagedTransaction事务。
JdbcTransaction完成事务的创建提交回滚
而ManagedTransaction啥事情都不做,把事务处理的权限交给上层调用方法,比如我们经常使用编程式事务transactionTemplate或者声明式事务@Transactional

但spring项目有他自己的事务,SpringManagedTransactionFactory和SpringManagedTransaction,基本也不做什么事情,交给上层调用方法。

五.mybatis的缓存机制

分为一级缓存和二级缓存
一级缓存: sqlSession级别的。在CachingExecutor中处理
二级缓存:mapper级别的。在BaseExecutor中处理

再进行过insert,update,delete操作后,缓存失效。

你可能感兴趣的:(数据库)