mybatis-初探源码

mybatis-初探源码

mybatis入门流程

        String resource = "org/mybatis/example/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        PersonDao mapper = sqlSession.getMapper(PersonDao.class);
        List<PersonEntity> personEntityList = mapper.queryAll();
        personEntityList.forEach(System.out::println);

1.通过 SqlSessionFactoryBuilder 对象 , 基于 配置文件(mybatis-config.xml) 构建

SqlSessionFactory

2.通过 SqlSessionFactory 连接工厂 创建 SqlSession 对象

3.通过 SqlSession 对象过去 Mapper 接口

mapper接口 --> mapper.xml 的 namespace

mapper接口方法- —> mapper.xml 的 id

sqlsession 执行 sql 语句 , 并处理接口

4.执行方法 对应的 sql 语句 , 处理结果

image-20220605221058575

mybatis源码自己第一次梳理

梳理出关键的几个类

  • SqlSessionFactoryBuilder

构建 SqlSessionFacotry

  • XMLConfigBuilder

通过配置文件生成配置类 Configuration

package org.apache.ibatis.session.Configuration
  • KnowMappers

加载的 mapper 接口

key : 对应 mapper 接口全类名

  • MapperMethod

封装了 Mapper接口中,对应方法的信息,以及对应 sql 语句的信息

excute方法 : 执行正真的 sql 语句

对应sql的crud , INSERT , UPDATE , DELETE , SELECT

  • Excutor
 @SuppressWarnings("unchecked")
  @Override
  public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
    ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
    /*xxx: 检测当前的 Executor 是否已经关闭 */
    if (closed) {
      throw new ExecutorException("Executor was closed.");
    }
    if (queryStack == 0 && ms.isFlushCacheRequired()) {
      /*xxx: 非嵌套查询,且 <select> 节点配置的  flushCache 属性为 true ,则会清空一级缓存*/
      /*xxx: flushCache 配置项 是影响 一级缓存 结果对象存活时长的一个方面*/
      clearLocalCache();
    }
    List<E> list;
    try {
      /*xxx: 增加查询层数*/
      queryStack++;
      list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;
      if (list != null) {
        /*xxx: 针对存储过程调用的处理, 在一级缓存命中时,获取缓存中保存的 输出类型参数, 并设置到用户传入的实参中*/
        handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
      } else {
        /*xxx: 其中会调用 doQuery完成数据库查询,并得到映射后的处理对象*/
        list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
      }
    } finally {
      /*xxx: 当前查询完成,查询层数减少*/
      queryStack--;
    }
    if (queryStack == 0) {
      /*xxx: 延迟加载的相关内容*/
      for (DeferredLoad deferredLoad : deferredLoads) {
        deferredLoad.load();
      }
      // issue #601
      /*xxx: 加载完成后,清空 deferredLoads 集合*/
      deferredLoads.clear();
      if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {
        // issue #482
        /*xxx: 根据localCacheScope 配置 决定是否清空一级缓存*/
        /*xxx: localCacheScope配置 是 影响一级缓存中 结果对象 存活时长的 第二个方面*/
        clearLocalCache();
      }
    }
    return list;
  }

query 方法参数的含义

ms : 表示映射配置文件中定义的 sql 节点

parameterObject : 查询的参数 , 和动态sql相关

resultHandler: 处理结果集

key:二级缓存 (一般不使用mybatis二级缓存)

boundSql: 该对象的 sql 属性值是需要执行的 sql 语句

mybatis的架构设计

image-20220605222121987

总结方法论

抓住关键点最重要

配置

mapper接口

mapper.xml

StatementHandler

excutor 执行器

tis的架构设计

[外链图片转存中…(img-pTr5z3P1-1654482327614)]

总结方法论

抓住关键点最重要

配置

mapper接口

mapper.xml

StatementHandler

excutor 执行器

ResultHandler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值