背??景最近听到很多抱怨:看到源码的时候,感觉很纠结,很困扰。为什么会纠缠不清?因为在面试的时候,面试官喜欢问:你看过什么框架源码?JDK源码也不错。此时,如果您还没有阅读答案,虽然没有要求您立即返回并等待通知。但也许,你在面试官心目中的印象会大打折扣。如果你看过答案并且能说得更流利,面试官可能会在心里佩服:你可以的,小伙子!(PS:很多面试官自己没有看过,或者看过很多忘了)。总之,如果你能说出123,就会给面试官一个好印象。为什么要担心工作?为什么要担心加薪?何必呢?大多数人的情况是:不是没有读过源码,而是每次都只读下一部分。为什么只看到下一部分?通常有以下三个原因:缺乏技术支持。看源码需要技术支持,不是新手能看懂的。没有一些技术支持,顶多看一小段,然后就看不下去了,就放弃了。缺乏正确的态度。看源码真的很无聊。如果你不放下心来,把它当成一项任务,你肯定会觉得无聊,容易放弃。时间不够。我真的很忙。我经常看完一部分就每天加班。我没有时间阅读它。一忙起来就忘记了之前看的XX的源码。个人建议对于一般的java程序员,阅读源码前需要具备哪些技能?个人建议,以下基础知识一定要知道:设计模式:包括单例模式、工厂模式、代理模式、装饰者模式、责任链模式、模板方法模式等可以猜:大胆猜,看源码的时候,想一想,如果你是Mybatis的设计者,你会怎么设计呢?我会挑重点:不要被不写参数验证和类型验证等问题卡在那里。会画图:流程图、类图等,找一些网上的画图工具,画好后保存媒体。如果你有一段时间没有阅读它们,你可以回头看看这些图片并快速继续。Mybatis源码分析今天我们就来看看Mybatis源码的阅读。下面看一个具体的例子:案例和问题从我们最初的demo开始:.getResourceAsStream(资源);SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);sqlSession=sqlSessionFactory.openSession();Usercomian.eltsqlSes(Oneusers.eltsqlSession.mybatis.mapper.UserMapper.selectById",1);System.out.println(user);}catch(Exceptione){e.printStackTrace();}finally{try{inputStream.close();}catch(IOExceptione){e.printStackTrace();}sqlSession.close();}}关于获取数据流inputStream,这个我们先不讨论,主要讲重点。对于上面的demo,我们可以分为五步:第一步是创建一个工厂类sqlSessionFactory。配置文件的解析是donehere.includemybatis-config.xml和我们的Mapper.xml映射器文件。我们关心的是这一步是:我们在解析过程中做了什么?生成了什么对象,解析的结果放在哪里。因为这就意味着我们后面使用的时候去哪里获取这个配置项的内容。第二步,通过SqlSessionFactory创建SqlSession。那么问题来了,SqlSession定义了各种增删改查的API,客户端调用,返回什么实现类?除了SqlSession,我们还创建了哪些对象和环境呢?第三步,获取一个Mapper对象。问题是UserMapper.java是一个接口,并没有为其创建实现类,那么它是如何实例化的呢?我们使用的Mapper对象是什么?为什么需要从SqlSession中获取呢?为什么传入一个接口,然后用一个接口接收呢?第四步,调用接口方法。问题是我们的接口没有实现类,为什么可以直接调用它的方法呢?它调用了谁的方法?我们如何关联SQL?我们如何获取数据?第五步,关闭关联资源。由于源码分析过程涉及的内容较多,下面用图来展示整个过程。我们可以通过这些图片快速浏览Mybatis的源代码。第一步是SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);这段代码的整个过程如下:根据inputStream,解析配置文件,创建一个默认的SqlSessionFactory实现类DefaultSqlSessionFactory。建一个工厂类,专门用来创建SqlSession对象。第二步SqlSessionsqlSession=sqlSessionFactory.openSession();整个获取SqlSession的过程如下:第三步Useruser=sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectById",1);第三步和第四步第一步就是通过这行代码画出来的。这一步是返回一个mapper代理类,专门用来绑定UserMapper接口和UserMapper.xml。可以实例化创建的代理类,然后调用usermapper接口。第四步:调用代理对象执行SQL的全过程。第五步,关闭资源。我希望你能按照这个过程找到一些源代码看看。听别人的,看别人的,永远是别人的。让我们继续前进!总结其实没什么好总结的。明白你为什么纠结!同时,我希望阅读我的建议。作为经历过的人,希望能帮助大家少走弯路。最后,对于Mybatis源码阅读的整个过程,最好先搭建本地环境,然后创建demo,一步步开启debug模式。本文转载自微信公众号《Java后端技术全栈》,可通过以下二维码关注。转载本文请联系Java后端技术全栈公众号。
