Mybatis源码解析(三)执行方法过程

上期我们讲了如何获取Mapper,我们获取到了Mapper之后,就要执行Mapper里面的方法,这篇我们就来详细讲解方法的执行过程
同样使用我们一直用的测试方法:

@Test
public void testFindAll() throws IOException {
    //加载主配置文件,目的是为了构建SqlSessionFactory对象
    InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");

    //创建SqlSessionFactory对象
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

    //通过SqlSessionFactory工厂对象创建SqlSesssion对象
    SqlSession sqlSession = factory.openSession();

    //通过Session创建UserDao接口代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    
    List<User> userList = mapper.findAll();
    for (User user : userList) {
        System.out.println(user);
    }
}

上一篇我们分析到了getMapper()方法,这一篇我们就来分析执行方法的这句代码:

List<User> userList = mapper.findAll();

其实它就是一个jdk动态代理,返回的是一个代理对象,详情往下看,这个时候我们只能通过调试代码来分析了,我们在这句代码打个断点
在这里插入图片描述
从上图我们也可以知道,它返回的是一个代理对象,我们跟进去看,使用快捷键F7,进入执行的方法
在这里插入图片描述
当前我们的类是在MapperProxy类中,它其实是真正的代理类,当执行方法的时候,它会执行我们重写的invoke()方法,第一句代码判断的执行的方法是不是Object里面的euqals()hashCode()等等方法,我们接着调试,按F8

在这里插入图片描述我们直接调试到关键语句,这句代码调用了mapperMethod.execute()方法,我们按F7进入方法里面
在这里插入图片描述
这个方法首先判断执行的Sql类型,是增删改查的哪一种,明显这里我们是SELECT语句
在这里插入图片描述
接下来判断方法的返回值类型,看看是返回的是集合还是单个对象
在这里插入图片描述
再次调用executeForMany()方法,我们接着进去这个方法
在这里插入图片描述
这个方法首先会做参数转化,参数转化这块后面我会专门写一篇,这里面还是有点东西的,现在我们只要知道这个方法是把我们的参数做处理了,接着往下
在这里插入图片描述
这个if判断的是有没有分页条件,显然这里我们没有分页
在这里插入图片描述
这里到了我们真正执行的方法的,它调用的是sqlSession里面的selectList()方法,我们F7直接进去
在这里插入图片描述
接着进去
在这里插入图片描述
首先它获取我们的mappedStatement
在这里插入图片描述
它又调用executor里面的query方法,我们进去
在这里插入图片描述
它再次调用query()方法
在这里插入图片描述
这个方法的逻辑首先判断缓存中有没有(这里是二级缓存),最后调用的是
delegate.query(),这里使用了装饰器模式,装饰的是delegate这个对象,我们接着进去
在这里插入图片描述
这里我们进入的是BaseExecutor,而我们的上一级执行的是CacheExetor,这里我们需要说明一下,在CacheExetor判断的是二级缓存,BaseExetor里面执行的是一级缓存的逻辑
在这里插入图片描述
我们来到这句代码,这句代码的意思是缓存里面没有,我们需要从数据库里面查询,我们接着进去
在这里插入图片描述
它执行了一个doQuery()方法,我们再直接进去
在这里插入图片描述
我们已经走到了SimpleExecutor类里面,其实它是BaseExetor的子类,这个方法主要创建StatementHandler,构建prepareStatement等等,我们再进去handle.query()方法
在这里插入图片描述
这里没有什么逻辑,接着跟进去
在这里插入图片描述
这里就是我们的终极方法了, 这里我们就到了最底层的JDBC的操作了,说明我们执行了真正的sql语句,但是它返回的是一个ResultSet,它又是怎么转换为我们的JavaBean的呢?这个我们就不必关心了,mybaits有它自己的处理器和工具类去完成这个功能
在这里插入图片描述
到此我们就完成了查询功能,我们也拿到了我们想要的结果

小结:其实mybatis源码并没有我们想象的那么复杂,它在一些常用的框架里面算是最简单的了,它代码量小,但是结构复杂,它里面的很多巧妙的设计模式是我们值得花时间去学习的

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华达州

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值