mybatis 源码解析笔记

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

https://blog.csdn.net/ykzhen2015/article/list/2?t=1

MyBatis的主要成员

  • Configuration        MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中
  • SqlSession            作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能
  • Executor               MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数等
  • ParameterHandler  负责对用户传递的参数转换成JDBC Statement 所对应的数据类型
  • ResultSetHandler   负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
  • TypeHandler          负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
  • MappedStatement  MappedStatement维护一条节点的封装
  • SqlSource              负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql              表示动态生成的SQL语句以及相应的参数信息

1、支持 xml 和annotation 两种配置

2、mapper 执行

  • 在binding 包下面,MapperProxy 动态代理 Mapper 接口(所以接口能返回结果)
  • MapperRegistry 管理mapper 接口

mybatis 源码解析笔记_第1张图片

3、插件实现

Plugin 类动态代理所有插件,根据签名判断要不要执行插件intercept 方法

  • executor, statementHandler,parameterHandler,resultHandler(四大对象)
  • statementHandler
    • RoutingStatementHandler,这是一个封装类,它不提供具体的实现,只是根据Executor的类型,创建不同的类型StatementHandler。
    • SimpleStatementHandler,这个类对应于JDBC的Statement对象,用于没有预编译参数的SQL的运行。
    • PreparedStatementHandler 这个用于预编译参数SQL的运行。
    • CallableStatementHandler 它将实存储过程的调度。

mybatis 源码解析笔记_第2张图片

4、typeHandler

5、一级缓存、二级缓存

  • 增删改查,除了查询都会更新缓存,但是仅仅会更新本Mapper 的缓存结果,如果别的mapper 查询结果中也包含相关信息,不会刷新,脏数据产生原因

6、级联查询的懒加载实现

懒加载:

  • 结果处理时,ResultSetHandler 会创建JavassistProxyFactory 内部类EnhancedResultObjectProxyImpl 动态代理 结果类型
  • 当调用 is get 或(hashcode、equals、toString、clone)时,触发代理执行数据加载
  • ResultLoader 里面执行sql 获取懒加载结果(调用executor 对象的方法)

mybatis 源码解析笔记_第3张图片

级联查询

  • 关于MyBatis级联有三种:
    • association  :一对一的关联
    • collection   : 一对多的关联
    • discriminator :鉴别器
  • N+1 问题
    • 设置懒加载,一对多关联查询,每一条返回结果,get、is、hash等方法会触犯而次查询,懒加载导致N 条结果N次查询,而不是查询所有
    • 以下设置为全局设置

mybatis 源码解析笔记_第4张图片
 

8、Executor

  • SimpleExecutor -- SIMPLE 就是普通的执行器。
  • ReuseExecutor -执行器会重用预处理语句(prepared statements)
  • BatchExecutor --它是批量执行器 

9、Example 自动生成sql

  • 没怎么关注过

 

转载于:https://my.oschina.net/u/3847203/blog/2221587

你可能感兴趣的:(mybatis 源码解析笔记)