mybatis -源码解析

mybatis -源码解析

一、mybatis 核心 接口

  1. Configration : 管理 mybatis-config.xml 全局配置关系类
  2. SqlSessionFactory :session管理工厂 接口
  3. SqlSession :SqlSession是面向用户操作数据库的接口,提供了很多操作数据库的方法
  4. Executor : 执行器是一个接口,提供了两种执行器:基本执行器和缓存执行器。sqlSession内部通过执行器实际
    操作数据库。
  5. MappedStatement : 底层封装对象。作用:对操作数据库存储封装,包括sql语句、输入输出参数等。
  6. StatementHandler : 具体操作数据库相关的handler接口。
  7. ResultSetHandler : 具体操作数据库返回结果的handler接口。

二、 整体认识 mybatis 源码包。
8. 包的结构
─java
│ │ └─org
│ │ └─apache
│ │ └─ibatis
│ │ ├─annotations – 注解相关,如@select 、@insert 等
│ │ ├─binding – mapper相关
│ │ ├─builder – 解析xml相关
│ │ ├─cache – 缓存相关
│ │ ├─cursor – 返回结果 resultset
│ │ ├─datasource – 数据管理
│ │ ├─exceptions – 异常相关
│ │ ├─executor – 执行器
│ │ ├─io – classloader
│ │ ├─jdbc – jdbc
│ │ ├─lang --jdk7 、jdk8
│ │ ├─logging – 日志相关
│ │ ├─mapping – mapper相关的封装
│ │ ├─parsing – xml相关解析
│ │ ├─plugin – 拦截器
│ │ ├─reflection – 反射相关
│ │ ├─scripting – 数据厂家
│ │ ├─session – session
│ │ ├─transaction – 事务
│ │ └─type – 返回数据类型对应

  1. 流程图

mybatis -源码解析_第1张图片
三 、 源码解析

  1. mybatis 之 configration :
    org.apache.ibatis.builder.xml.XMLConfigBuilder > parse 获取configration
  • propertis 解析
    org.apache.ibatis.builder.xml.XMLConfigBuilder > propertiesElement
  • settings 解析
    org.apache.ibatis.builder.xml.XMLConfigBuilder > settingsElement
  • environments 解析
    org.apache.ibatis.builder.xml.XMLConfigBuilder > environmentsElement
  1. mybatis 之 sqlsession
    mybatis -源码解析_第2张图片

org.apache.ibatis.session.SqlSessionFactoryBuilder> build
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory >openSessionFromDataSource
org.apache.ibatis.session.defaults.DefaultSqlSession

  1. mybatis 之mapper
    mybatis -源码解析_第3张图片

    org.apache.ibatis.session.defaults.DefaultSqlSession > getMapper
    org.apache.ibatis.session.Configuration >getMapper
    org.apache.ibatis.binding.MapperRegistry > getMapper
    org.apache.ibatis.binding.MapperProxyFactory >newInstance

  2. mapper 之sql:
    org.apache.ibatis.binding.MapperMethod.execute

    org.apache.ibatis.session.SqlSession.selectOne(java.lang.String, java.lang.Object)
    org.apache.ibatis.executor.BaseExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)
    org.apache.ibatis.mapping.MappedStatement.getBoundSql

  3. mybatis 之 executor:
    mybatis -源码解析_第4张图片
    其实是不干事情的

    org.apache.ibatis.executor.statement.StatementHandler
    org.apache.ibatis.executor.statement.PreparedStatementHandler
    org.apache.ibatis.executor.resultset.ResultSetHandler
    org.apache.ibatis.executor.resultset.DefaultResultSetHandler

  4. mybatis 之 cache
    每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取一些措施的话,每一次查询都会查询一次数据库,而我们在极短的时间内做了完全相同的查询,那么它们的结果极有可能完全相同,由于查询一次数据库的代价很大,这有可能造成很大的资源浪费。为了解决这一问题,减少资源的浪费,MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候,如果判断先前有个完全一样的查询,会直接从缓存中直接将结果取出,返回给用户,不需要再进行一次数据库查询了。
    cache key: id +sql+limit+offsetxxx

    org.apache.ibatis.executor.BaseExecutor >createCacheKey

作用域:一级缓存session
全局:二级缓存sqlSessionFactory
mybatis -源码解析_第5张图片

你可能感兴趣的:(框架)