• 执行流程:
      • 启动的时候回去解析xml文件,将xml文件封装为一个xnode对象 ,读取xnode对象吧属性设置到configuration对象中:初始化的时候会去初始化一些配置 别名等
      • 读取sql的配置文件;封装到一个mappedStatment对象中;(先判断是否包含增删改查四种标签)其中
        • id属性为命名空间(namespace+方法id)
        • sqlSource 保存sql语句
        • statmentType属性保存 执行slq的stament的类型(preperstament,call)
        • …以及一些参数的值
      • 将每一个对象都保存到 configuration对象的mappedStatment map集合中 ,其中key是命名空间+方法名
    • 执行流程:
      • 定义一个xml文件,这个文件里面描述了数据源(datasource),mapper映射,别名的映射等,定义好之后,启动时候就会去解析xml文件, 冰川建sqlsessionfantory对象,解析过程中sqlsessionfantoryBuilder里面提供了一个builde方法,这方法做了一个非常核心的事情,就是初始化Configuration对象
      • 把解析好的内容放到configuration对象中,其中就包括别名的映射,在初始化阶段别名的映射就会自动注册一些常用的别名,如果我们自己也配置了也会注册到TpyeAliasRegistry 的map中
      • 并且把配置文件中的数据源和事务解析后放入到Evironment对象中,给后续的执行,提供数据连接和事务管理
      • 然后再解析mapper.xml配置文件,根据配置文件的解析规则,会解析里面对应的节点,比如<select<update<insert<delete<等标签 其中的一些属性 例如 resultMap chache等,然后把每个解析的节点放入到一个叫mapperStatment对象中,sql语句就放入到这个对象的sqlSource属性中 这个属性也是一个对象 底层就是boundSql,
      • 把每一个mapperStatement对象放入到Configuration对象的全局Map(mapperedStatements) ,已节点的id(方法名)和命名空间+id(方法名)作为key,已mapperstatement作为value
    • 缓存
      • 1级缓存是默认开启的,如果查询中间没有穿插增删改操作, 则同样的sql查询结果是去缓存里面查找,
      • select 标签的 flusCache 默认为false ,insert,update,delete,默认为true ,所以查询不会刷新缓存,而增删改会刷新缓存,避免读到脏数据
    • 执行器Executor
      • mybatis提供很多执行器,其目的就是为了插件机制,和缓存做一系列的执行器,每一种执行器都有对应的业务和核心逻辑
      • 执行器(Executor)的实现有三种
        • SimpleExecutor 简单执行器(默认的)
        • ReuseExecutor 可重用执行器 : 重复使用,该执行器维护了一个sql与Statement对应关系的一个缓存对像,可以复用Statement
        • BatchExecutor 批处理执行器
        • CachingExecutor 缓存执行器,TransactionalCacheManager维护缓存对像,一个本地的HashMap,当使用mybatis缓存时由该执行器负责处理
      • 简单执行器:
        • 简单执行器是执行器的默认实现,只要完成了””执行的功能”,在利用StatementHandler完成,每次调用执行方法 都会构建一个StatementHandler,并预行参数,然后执行
        • 默认情况是:Executor 是 CachingExecutor, 这个执行器是耳机缓存执行器, 如果你在配置文件中配置了二级缓存 就是使用CachingExecutor, 否则的话就会委托(delegate变量名) simpleExecutor去执行你的sql语句,通过SimpleExecutor执行的结果放入一级缓存localCache中,
      • 缓存是什么?
        • 这里缓存就是map集合
        • 先走的是二级缓存 (二级缓存是全局的)
      • 缓存的key是怎么设置的
        • 缓存的key是由:namespace+偏移量(0—Integer.max_value)id+sql+全局配置的id+参数;来求hash值(保证唯一)
        • 二级缓存和一级缓存的key是一样的
      • 缓存优先级
        • 同时开启的话,先走二级缓存,二级缓存优先级大于一级缓存

    image.png

    • 二级缓存是mapper级别 可以理解为xml级别 一个xml对应一个mapper,是一种跨slqsession级别的缓存,理解为多个sqssion都可以去共享,二级缓存是默认开闭的 开启需要去配置
    • 一级缓存是sqlssesion级别的每一个sqlsesion会话对应一个一级缓存, 默认是开启的,可以减少数据库压力,避免产生 max connection exception
    • image.png
    • 缓存回收测策略
      • LRU最近最少使用(默认的)
      • FIFO 先进先出
      • SOFT 软引用
      • WEAK 弱引用
    • 类型转化器ResultSetHandler
      • 数据库中的每一个数据类型都对应一种类型转换器
    • 插件原理分析
      • 实现原理:使用责任链模式+jdk动态代理
      • 初始化的时候解析配置的interceptor 实现类 反射创建对象
      • 读取属性,调用setProperties 设置属性 吧对象加入一个list集合中 这些拦截器就是拦截器链
      • 拦截器主要针对是个接口拦截
        • Executor执行器接口 拦截符合规则的方法
        • ParamterHandler拦截参数处理的接口 拦截参数的处理
        • ResultSetHandler处理结果集的接口 拉结结果集的处理
        • StatementHandler sql处理的接口 , 拦截sql语法的处理
      • 拦截器核心方法
        • plgin(obj)方法参数代理对象

    image.png
    image.png