mybatis 源码解析笔记

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

MyBatis的主要成员sql

  • 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维护一条<select|update|delete|insert>节点的封装
  • SqlSource              负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql              表示动态生成的SQL语句以及相应的参数信息

一、支持 xml 和annotation 两种配置数据库

二、mapper 执行缓存

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

三、插件实现app

Plugin 类动态代理全部插件,根据签名判断要不要执行插件intercept 方法.net

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

四、typeHandler插件

五、一级缓存、二级缓存代理

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

六、级联查询的懒加载实现code

懒加载:xml

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

级联查询

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


 

八、Executor

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

九、Example 自动生成sql

  • 没怎么关注过
相关文章
相关标签/搜索