栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis源码学习(五):流程Debug

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis源码学习(五):流程Debug

前文回顾:

在前几篇文章中我们分析了Mybatis的几个核心对象,陈述了各对象的作用以及对源码做了简单的分析。本文会将前几篇文章中提到的核心对象做一次串联,以一个简单的查询为例Debug流程,探究Mybatis是如何执行我们所编写的SQL的。

一、前置代码

1、实体类

@Alias("Person")
public class Person {

    private Long id;

    private String username;

    private String password;
    
    //省略get/set toString方法
 
}

2、Dao接口

public interface PersonMapper {


    List selectAll();
    
    Person selectById(@Param("id")Long id);
}

3、main方法

    public static void main(String[] args) throws Exception {
        String resource = "mybatis-config.xml";
        //读取mybatis配置文件并获取输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        try (SqlSession session = sqlSessionFactory.openSession()) {
            PersonMapper mapper = session.getMapper(PersonMapper.class);
            Person person = mapper.selectById(1L);
            System.out.println(person);
        }
    }

二、开始Debug

我们在 Person person = mapper.selectById(1L);这一行上打上断点,然后进入。

我们会发现进入了一个名为MapperProxy的类**,从该类的命名中可以看出这个是一个代理类,实际上Mybatis是通过JDK动态代理来“实例化”接口的(其实是动态的创建了Mapper接口的实现类,这一部分在后文后讲解,这里只是提出这个概念)。
其中核心的代码是mapperMethod.execute(sqlSession, args),通过Debug可以看出这个 args参数就是我们传入的id = 1;继续往下Debug,我们进入了MappedMethod类中的execute方法**

首先该方法会判断我们的SQL类型,很明显本次的SQL是SELECT类型的,同时返回的是单个数据,所以我们进入了result = sqlSession.selectOne(command.getName(), param);这行代码,继续Debug,然后就进入了我们熟悉的DefaultSqlSession,同时也看到了我们熟悉的SimpleExecutor

继续Debug,然后就遇见了前文分析过的BaseExecutor中的query方法

继续Debug之后又又又又遇到了熟悉的代码StatementHandler

继续Debug,就碰到了前文分析过的ResultSetHandler,最终我们就获得了要查询的结果。

三、流程图


四、结束语

至此我们已经对Mybatis是如何执行一个SQL做了一次Debug,实际上还有很多复杂的操作,这里我们不需要了解,对于框架的学习我们更多学习的是思想,知道框架是如何运行的,不必过分在意一两个类或者一两个方法时如何执行的。下一篇文章我们会探究Mybatis中的Dao接口是如何被“实例化的”,希望对你有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031619.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号