看到Mybatis源码就感到烦躁,怎么办?

运维 数据库运维
因为面试的时候,面试官很喜欢问:你看过什么框架源码?JDK源码也行。这时候,如果回答没有看过,虽然没让你立马回去等通知。但也许,你在面试官心中的印象就大打折扣了。

 [[357382]]

背景

最近,听到很多吐槽:看到源码,心中就感到十分纠结、特别烦恼。

为什么纠结?

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

这时候,如果回答没有看过,虽然没让你立马回去等通知。但也许,你在面试官心中的印象就大打折扣了。

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

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

为什么烦?

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

缺乏技术支撑。看源码是需要技术支撑的,不是随便一个小白也能看懂的。没有一些技术支撑,你顶多看看一小段,然后就看不下去,于是就放弃了。

缺乏正确心态。看源码确实挺无聊的,如果大家心态没放好,把它当做一种任务去做,肯定觉得无聊,而且很容易放弃。

缺乏足够时间。确实很忙,经常看了一部分后,天天加班,没时间看,忙完后又忘了之前正在看的某某源码。

个人建议

对于一般java程序员来说,阅读源码之前到底需要些什么技能呢?

个人建议,以下基础知识必须会一些:

会设计模式:包括单例模式、工厂模式、代理模式、装饰器模式、责任链模式、模板方法模式等。

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

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

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

Mybatis源码分析

今天,我们就来看看Mybatis源码的阅读,具体举个例子来看看:

案例和疑问

从我们最初的demo中开始:

  1. public static void main(String[] args) { 
  2.         String resource = "mybatis-config.xml"
  3.         InputStream inputStream = null
  4.         SqlSession sqlSession = null
  5.         try { 
  6.             inputStream = Resources.getResourceAsStream(resource); 
  7.             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
  8.             sqlSession = sqlSessionFactory.openSession();  
  9.             User user = sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById", 1); 
  10.             System.out.println(user);  
  11.         } catch (Exception e) { 
  12.             e.printStackTrace(); 
  13.         } finally { 
  14.             try { 
  15.                 inputStream.close(); 
  16.             } catch (IOException e) { 
  17.                 e.printStackTrace(); 
  18.             } 
  19.             sqlSession.close(); 
  20.         } 
  21.     } 

关于获取数据流inputStream,这个我们就不讨论了,我们主要关注重点。

对于上面demo,我们可以分成五个步骤:

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

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

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

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

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

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

第四步,调用接口方法。

问题是我们的接口没有实现类,为什么就可以直接调用它的方法呢?那它调用的是谁的方法呢?是如何把SQL给关联起来的呢?是如何获取到数据的呢?

第五步,关闭相关资源。

开始源码分析过程

由于涉及到内容较多,下面就用几张图来展示整个流程。我们可以通过这几张图来快速翻阅Mybatis的源码。

第一步

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

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

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

第二步

  1. SqlSession  sqlSession = sqlSessionFactory.openSession(); 

获取SqlSession的整个流程如下:

第三步

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

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

这一步是返回一个映射器代理类,映射器代理类专门用来给UserMapper接口和UserMapper.xml绑定的代理类。创建出来的代理类就可以实例化了,然后就可以调用UserMapper接口的方了。

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

第五步,关闭资源。

希望大家按照这个流程,找点源码看看。听别人的看别人永远是别人的。

动起来吧!

总结

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

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

本文转载自微信公众号「 Java后端技术全栈」,可以通过以下二维码关注。转载本文请联系 Java后端技术全栈公众号。

 

责任编辑:武晓燕 来源: Java后端技术全栈
相关推荐

2024-07-15 09:08:51

源码debug根节点

2022-05-17 10:41:20

接口JSON数据

2017-02-21 13:11:43

SDN网络体系SDN架构

2024-04-22 08:17:23

MySQL误删数据

2022-12-19 11:31:57

缓存失效数据库

2009-11-03 08:56:02

linux死机操作系统

2022-05-19 08:01:49

PostgreSQL数据库

2015-10-22 09:09:59

BAT投资VC

2019-10-12 09:50:46

Redis内存数据库

2018-01-28 20:39:39

戴尔

2022-07-05 11:48:47

MySQL死锁表锁

2024-10-09 17:06:52

RedisHash哈希表

2020-03-18 19:00:29

电脑内存不足系统

2017-12-21 20:01:38

润乾报表

2019-08-29 07:35:29

网站404空白nginx

2011-07-28 13:45:06

2020-12-30 08:35:59

Linux运维Linux系统

2022-10-14 08:18:07

Guavaweb应用

2010-04-20 08:56:53

2022-07-05 14:19:30

Spring接口CGLIB
点赞
收藏

51CTO技术栈公众号