关于mybatis:让人纠结的mybatis源码我该拿你怎么办

56次阅读

共计 2931 个字符,预计需要花费 8 分钟才能阅读完成。

关注“Java 后端技术全栈”

回复“面试”获取全套面试材料

背景

最近,听到很多吐槽:看到源码,心中就感到非常纠结、特地懊恼。

为什么纠结?

因为面试的时候,面试官很喜爱问:你看过什么框架源码?JDK 源码也行。

这时候,如果答复没有看过,尽管没让你立马回去等告诉。但兴许,你在面试官心中的印象就大打折扣了。

如果答复看过,并且还能较为流利地说上一番,那面试官或者会在心里赞叹:小伙子能够呀!(PS:很多面试官本人也没看过,或者看过很多也忘了)。

总之,你要是能说上个 123,那给面试官的印象就会杠杠滴好。何愁工作?何愁加薪?

为什么烦?

大部分人的状况是:源码不是没有看过,而是每次只看得下一部分。为什么只看得下一部分呢?通常有上面三种起因:

  1. 不足技术撑持。看源码是须要技术撑持的,不是轻易一个小白也能看懂的。没有一些技术撑持,你顶多看看一小段,而后就看不下去,于是就放弃了。
  2. 不足正确心态。看源码的确挺无聊的,如果大家心态没放好,把它当做一种工作去做,必定感觉无聊,而且很容易放弃。
  3. 不足足够工夫。的确很忙,常常看了一部分后,天天加班,没工夫看,忙完后又忘了之前正在看的某某源码。

集体倡议

对于个别 java 程序员来说,浏览源码之前到底须要些什么技能呢?

集体倡议,以下基础知识必须会一些:

会设计模式:包含单例模式、工厂模式、代理模式、装璜器模式、责任链模式、模板办法模式等。

会猜想:大胆的猜想,在看源码的时候,多站在高层次想想,如果你是 Mybatis 的设计者,你会怎么设计?

会挑重点看:别被没写参数校验、类型校验等问题卡在那里。

会画图:流程图、类图等,找一些在线画图工具,媒体画完就保留下来,如果中途一段时间不看了,再回头看看这些图,也能疾速持续。

Mybatis 源码剖析

明天,咱们就来看看 Mybatis 源码的浏览,具体举个例子来看看:

案例和疑难

从咱们最后的 demo 中开始:

public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        SqlSession sqlSession = null;
        try {inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = sqlSessionFactory.openSession(); 
            User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1);
            System.out.println(user); 
        } catch (Exception e) {e.printStackTrace();
        } finally {
            try {inputStream.close();
            } catch (IOException e) {e.printStackTrace();
            }
            sqlSession.close();}
    }

对于获取数据流 inputStream,这个咱们就不探讨了,咱们次要关注重点。

对于下面 demo,咱们能够分成五个步骤:

第一步,创立一个工厂类 sqlSessionFactory。

配置文件的解析就是在这里实现的。包含 mybatis-config.xml 和咱们的 Mapper.xml 映射器文件。这一步咱们关怀的内容是:解析的时候做了什么?产生了什么对象,解析的后果放在哪里的。因为这将意味着,咱们前面应用的时候去哪里获取这项配置项内容。

第二步,通过 SqlSessionFactory 创立一个 SqlSession。

那么问题来了,SqlSession 中定义了各种增删改查的 API,是给客户端调用,返回的是什么实现类?除了 SqlSession 以外,咱们还创立了什么对象,创立了什么环境?

第三步,获取到一个 Mapper 对象。

问题来了 UserMapper.java 是一个接口,并没有为它创立实现类,那又是怎么被实例化的呢?咱们应用的这个 Mapper 对象到底是什么对象呢?为什么要从 SqlSession 里去获取呢?为什么传进去一个接口,而后还要用一个接口去接管呢?

第四步,调用接口办法。

问题是咱们的接口没有实现类,为什么就能够间接调用它的办法呢?那它调用的是谁的办法呢?是如何把 SQL 给关联起来的呢?是如何获取到数据的呢?

第五步,敞开相干资源。

开始源码剖析过程

因为波及到内容较多,上面就用几张图来展现整个流程。咱们能够通过这几张图来疾速翻阅 Mybatis 的源码。

第一步

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

这一句代码的整个流程如下:

依据 inputStream,解析配置文件,创立出一个 DefaultSqlSessionFactory 默认的 SqlSessionFactory 实现类。构建出一个工厂类,这个工厂类专门用来创立 SqlSession 对象的。

第二步

SqlSession  sqlSession = sqlSessionFactory.openSession();

获取 SqlSession 的整个流程如下:

第三步

User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1);

第三步和第四步就是这行代码画的。

这一步是返回一个映射器代理类,映射器代理类专门用来给 UserMapper 接口和 UserMapper.xml 绑定的代理类。创立进去的代理类就能够实例化了,而后就能够调用 UserMapper 接口的方了。

第四步:调用代理对象执行 SQL 的整个过程。

第五步,敞开资源。

心愿大家依照这个流程,找点源码看看。听他人的看他人永远是他人的。

动起来吧!

总结

其实,没什么好总结的。好好领悟一下为什么纠结吧!同时心愿能看看我的倡议,作为一个过来人,心愿能帮忙大家少走弯路。

最初,对于 Mybatis 源码浏览的整个流程,最好是本地环境搭起来,而后搞个 demo,debug 模式一步一步走起。

举荐浏览

《图解数据结构》.pdf

7 种启动 Spring Boot 我的项目的形式,一次性打包说给你听

JVM 真香系列:图解垃圾回收器

正文完
 0