Mybatis源码专题

一,执行流程

总结 

  • 核心依赖于动态代理模式创建Mapper接口代理实例
  • SqlSessionFactory负责创建SqlSession,全局唯一实例(类似于单例)
  • Configuration 核心中的核心,走到哪里都有它的存在,而且是全局唯一实例(类似于单例)

二,注入容器流程 

1:MapperScan 扫描Mapper接口,注册到Spring容器

向Spring注册MapperScannerConfigurer,它实现了BeanDefinitionRegistryPostProcessor
将扫描到所有的Mapper接口(BeanDefinition)定义信息的BeanClass设置为MapperFactoryBean
设置Bean定义信息(BeanDefinition)属性autowireMode为AUTOWIRE_BY_TYPE


2:从Spring容器创建Mapper接口的代理对象实例

MapperFactoryBean实现了FactoryBean,所以调用getObject()获取对象实例。
通过SqlSessionTemplate.getMapper,再经过Configuration.getMapper,创建一个Mapper接口的代理对象


3:Mapper接口SQL执行

SqlSessionTemplate.CRUD CRUD 是SQL操作方法,它实现了SqlSession接口。
SqlSessionTemplate.sqlSessionProxy.CRUD, sqlSessionProxy = SqlSessionTemplate.SqlSessionInterceptorJDK代理回调。
SqlSessionTemplate.SqlSessionInterceptor.invoke(),
先从Spring事务管理器中获取是否有SqlSession,如果没有,则在 当前Spring事务中,获去SQL连接,在用这个SQL连接获取SqlSession。
执行完目标方法,如果应用的Spring事务管理,则Spring事务会自动提交,如果没有应用,则mybatis-spring会自动提交事务。


4,总结

mybatis-spring,每次执行Sql都会是一个新的SqlSession会话连接,所以不要去关心SqlSession的一级缓存线程安全问题
它自定义了一个Spring事务管理器,可以非常方便的应用Spring事务。
就算没有去应用Spring事务,mybatis-spring也会自动提交事务,所以开发过程,不用去操心事务没有提交的问题
mybatis-spring开发如果我们想要手动去开启,提交,回滚事务,就必选要应用到Spring事务管理器。
mybatis-spring创建的每一个Mapper接口的Bean实例,都是线程安全的
 

三,源码结构

初始化,解析配置文件相关类

src/main/java/org/apache/ibatis/session/Configuration:核心中核心配置类,无论执行什么操作,都有他的存在。


src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder:解析mybatis-config.xml。


src/main/java/org/apache/ibatis/builder/xml/XMLMapperBuilder:解析mapper.xml。


src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder:解析mapper.xml中的Sql语句。


src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder:解析Mapper接口的注解信息。


src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant:解析mapper.xml的辅助工具类。


src/main/java/org/apache/ibatis/mapping/MappedStatement:描述<select|update|insert|delete>或者@Select、@Update等注解配置的SQL信息。


src/main/java/org/apache/ibatis/binding/MapperRegistry:mapper注册器,用于将所有的mapper接口添加到内存中(缓存)。


会话,创建相关类

src/main/java/org/apache/ibatis/session/SqlSessionFactoryBuilder:用于创建SqlSessionFactory。


src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSessionFactory:默认的Sql会话工厂,用于获取SqlSession。


src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession:默认的Sql会话。


src/main/java/org/apache/ibatis/binding/MapperProxyFactory:创建Mapper接口代理的工厂类。


src/main/java/org/apache/ibatis/binding/MapperProxy:Mapper代理的回调,(InvocationHandler)


执行Sql相关的类

src/main/java/org/apache/ibatis/binding/MapperMethod:执行SQL的描述信息,执行操作。


src/main/java/org/apache/ibatis/mapping/BoundSql:、在执行一次CRUD操作过程中产生的中间数据的集中点。


src/main/java/org/apache/ibatis/cache/Cache:缓存接口,自定义二级缓存实现此接口。


src/main/java/org/apache/ibatis/executor/BaseExecutor:基础的执行器,所有的执行器都继承自它。


src/main/java/org/apache/ibatis/executor/CachingExecutor:开启的二级缓存的执行器;(默认是开启的)。


src/main/java/org/apache/ibatis/executor/SimpleExecutor:简单的执行器,也是默认的执行器。


src/main/java/org/apache/ibatis/executor/statement/StatementHandler:负责处理Mybatis与JDBC之间Statement的交互(是一个接口)


src/main/java/org/apache/ibatis/executor/statement/RoutingStatementHandler:类型于路由器,用于选择SimpleStatementHandler,PreparedStatementHandler,CallableStatementHandler。(这些类都实现了StatementHandler接口)


src/main/java/org/apache/ibatis/executor/statement/PreparedStatementHandler:与PreparedStatement交互作用。


PreparedStatement:预编译Sql执行。


src/main/java/org/apache/ibatis/executor/resultset/ResultSetHandler:将结果集resultSets转化成Java对象,(是一个接口)。


src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler:默认的结果集处理器,实现ResultSetHandler接口。


事务相关的类

src/main/java/org/apache/ibatis/session/TransactionIsolationLevel:事务隔离级别。(枚举类)。


src/main/java/org/apache/ibatis/transaction/Transaction:定义事务抽象方法的接口。


src/main/java/org/apache/ibatis/transaction/TransactionFactory:事务创建工厂,(是一个接口)


src/main/java/org/apache/ibatis/transaction/jdbc/JdbcTransactionFactory:创建JdbcTransaction工厂类。


src/main/java/org/apache/ibatis/transaction/jdbc/JdbcTransaction:JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nathaniel333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值