mybatis 原理分析
一.mybatis的作用
大家都懂的
二.spring项目中使用mybatis
1.需依赖的maven包
2.如何使用
大家都会
使用mybatis-generator-core.jar以及configfile生成对应的文件,包括
xxxEntity, xxxExample,xxxMapper,xxxMapper.xml。
使用注意点:
确保xxxMapper.xml中的namespace和sql id 同 xxxMapper路径和方法名保持一致对应。
三.spring - mybatis 框架的执行过程
1.sqlSessionFactory启动初始化
说明:
SqlSessionFactoryBean 负责构建Configuration,收集各种配置信息,包括各种xxxMapper.xml以及datasource,plugins等。
SqlSessionFactoryBuild利用configuration生成sqlSessionFactory,并有spring容器托管;
主要源码:
SqlSessionFactoryBean中buildSqlSessionFactory的过程
configuration中关键的mappedStatements
2.xxxMapper 接口的实现类
其中SqlSessionTemplate是spring-mybatis的核心,实现了SqlSession接口。
SqlSessionTemplate调用getMapper方法,通过configuration对象,传递给MapperProxyFactory,创建MapperProxy对象,即为xxxMapper接口的实现代理实现类。
主要源码:
MapperRegistry调用MapperProxyFactory
MapperProxyFactory执行过程
SqlSessionTemplate实例
3.CRUD操作
以xxxMapper.selectByExample()方法调用为例,方法被拦截,进行代理类的invoke方法
接下来交给mapperMethod处理
SqlCommand里面存储了本次操作的MapperStatement,通过反射,查询configuration的mapperStatements表获得。
mapperMethod交给sqlSessionTemplate处理,sqlSessionTemplate调用统一的代理方法,然后交给DefaultSqlSession处理,
DefaultSqlSession交给CachingExecutor处理,CachingExecutor再交给BaseExecutor处理(先查缓存,再查数据库)
最后交给SimpleExecutor,执行jdbc操作
四.mybatis的事务管理
mybatis本身的事务工厂有两种类型
JdbcTransactionFactory 和 ManagedTransactionFactory,分别创建JdbcTransaction
和ManagedTransaction事务。
JdbcTransaction完成事务的创建提交回滚
而ManagedTransaction啥事情都不做,把事务处理的权限交给上层调用方法,比如我们经常使用编程式事务transactionTemplate或者声明式事务@Transactional
但spring项目有他自己的事务,SpringManagedTransactionFactory和SpringManagedTransaction,基本也不做什么事情,交给上层调用方法。
五.mybatis的缓存机制
分为一级缓存和二级缓存
一级缓存: sqlSession级别的。在CachingExecutor中处理
二级缓存:mapper级别的。在BaseExecutor中处理
再进行过insert,update,delete操作后,缓存失效。