例:

package com.example.demo.service;

import com.example.demo.dao.UserDao;
import com.example.demo.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.List; @Service
@Slf4j
public class UserService { @Autowired
private UserDao userDao; public List<User> getUser(){
List<User> userList = userDao.getUser();
log.info("查询出来的用户信息,{}",userList.toString());
return userList;
}
}

当userService中的getUser方法执行的时候,userDao.getUser()是怎么走的?

1、在springboot项目启动时,加载mybatis相关配置,同事会在MapperRegister中保存mapper的代理类,在创建UserService bean的时候,需要注入userDao类,但userDao类是一个Interface类型,所以在注入的时候其实是注入的一个mapper代理类,也就是MapperProxy类

2、当执行userDao.getUser()时,会走MapperProxy中的invoke方法,最终是通过mapperMethod.execute(sqlSession. args)

3、进入MapperMethod的execute方法,会根据select、insert、update 来走不同的方法

4、本次测试时走的是SELECT 的case,在该case中会判断是否有返回值(返回值得处理器),因本次查询返回值是一个list,所以会走executeForMany()

5、进入到executeForMany中,参数是SQLSessionTemplate和null,进行处理后,进入到sqlsession.<E>selectList(*, *)中

6、该selectList方法调用的是SQLSessionTemplate类的selectList

7、进入到sqlSessionProxy(该代理类其实就是DefaultSqlSession)的selectList方法中,参数statement就是mapper方法,paramter为null,

在selectList方法中,会从Configuration对象中获取statement对应的对象,然后通过执行器executor的query来执行

8、进入到executor的query方法中,当前的executor默认是CachingExecutor

9、进入到CachingExecutor的query方法中,在当前方法中会先获取相应的BindSql,然后会创建cache

10、进入到createCacheKey方法中,该方法其实是BaseExecutor中的方法

11、创建完成之后,会调用query方法,在方法中,会先查询cache,没有再调用delegate的query方法

12、delegate是BaseExecutor(执行器),在当前方法中也会先从缓存中查询,查询不到在从库中查询

13、进入queryFormDatabase方法中,在方法中会将之前创建的cacheKey保存到localCache中,然后在执行doQuery方法

14、进入到doQuery方法中,也就是默认的simpleExecutor中

15、进入到configuration.newStatementHandler中(默认statement为preparedStatement)

16、返回preparestatementHandler处理器,然后调用prepareStatement方法

18、在方法中会通过prepareStatement的execute来查询数据库,完毕后,会在handeler中处理返回数据

19、处理返回数据是在DefaultResultSetHandler类中

20、处理完成后悔返回一个list<Object>对象

springboot集成mybatis源码分析-mybatis的mapper执行查询时的流程(三)的更多相关文章

  1. MyBatis源码分析-MyBatis初始化流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  2. 精尽 MyBatis 源码分析 - MyBatis 初始化(一)之加载 mybatis-config.xml

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  3. 精尽MyBatis源码分析 - MyBatis初始化(二)之加载Mapper接口与XML映射文件

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  4. 精尽 MyBatis 源码分析 - MyBatis 初始化(三)之 SQL 初始化(上)

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  5. 精尽MyBatis源码分析 - MyBatis初始化(四)之 SQL 初始化(下)

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  6. 精尽MyBatis源码分析 - MyBatis 的 SQL 执行过程(一)之 Executor

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  7. MyBatis源码分析(各组件关系+底层原理

    MyBatis源码分析MyBatis流程图 下面将结合代码具体分析. MyBatis具体代码分析 SqlSessionFactoryBuilder根据XML文件流,或者Configuration类实例 ...

  8. 精尽MyBatis源码分析 - 文章导读

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  9. springboot整合mybatis源码分析

    springboot整合mybatis源码分析 本文主要讲述mybatis在springboot中是如何被加载执行的,由于涉及的内容会比较多,所以这次只会对调用关系及关键代码点进行讲解,为了避免文章太 ...

随机推荐

  1. CentOS7下解决yum install mysql-server 异常:No package mysql-server available.问题

    yum安装mysql-server没有可用包问题解决方法: step 1: wget http://repo.mysql.com/mysql-community-release-el7-5.noarc ...

  2. vue 限制输入字符长度

    一.watch方法: <input v-model="textareaValue" type="textarea" placeholder="请 ...

  3. redis--主从同步,故障切换,集群搭建

    一 . redis主从同步 准备三个配置文件,实现一主两从的redis数据库结构(这三个配置文件仅仅端口不一样) # redis-6379.conf 文件, 写入下面数据: port 6379 dae ...

  4. css定位的各属性占位问题

    CSS position 属性  不定位 static 元素框正常生成.块级元素生成一个矩形框,作为文档流的一部分,行内元素则会创建一个或多个行框,置于其父元素中. ----------------- ...

  5. Ubuntu16.04安装Redis并配置

    Ubuntu16.04安装Redis并配置 2018年05月22日 10:40:35 Hello_刘 阅读数:29146   Ubuntu16.04安装Redis并配置 1):安装: 1:终端命令下载 ...

  6. 电脑装windows和ubuntu,如何卸载ubuntu系统

    电脑装windows和ubuntu,如何卸载ubuntu系统 2018年01月17日 16:28:29 职业炮灰 阅读数:684    版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  7. JS Array.reduce 对象属性累加

    Array reduce() 方法  ,无非就是 计算数组元素 相加后的总和 ,看网上给的Demo 全是  [1,2,3,4,6].reduce 这种基本用法, 本次我将使用 reduce 实现 数组 ...

  8. BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)

    题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...

  9. elastalert

    http://blog.51cto.com/kexiaoke/1977481 什么是? ElastAlert是一个简单的框架,用于从弹性搜索中的数据中提取异常,尖峰或其他感兴趣的模式.在Yelp,我们 ...

  10. MYSQL 企业常用架构与调优经验分享

    一.选择Percona Server.MariaDB还是MYSQL  mysql应用源码:http://www.jinhusns.com/Products/Download/?type=xcj 1.M ...