面试必问|聊聊MyBatis执行流程?

6feeab9d62162092bf359b7d04f8febc.png

若有收获,请记得分享和转发哦

随着互联网的发展,越来越多的公司摒弃了Hibernate,而选择拥抱了MyBatis。而且,很多大厂在面试的时候喜欢问MyBatis底层的原理和源码实现。

总之,MyBatis几乎成为了Java开发人员必须深入掌握的框架技术,今天,我们就一起来深入分析MyBatis源码。文章有点长,建议先收藏后慢慢研究。整体三万字左右,全程高能,小伙伴们可慢慢研究。

本文主要结构如下所示。

面试必问|聊聊MyBatis执行流程?_第1张图片

MyBatis源码解析

大家应该都知道Mybatis源码也是对Jbdc的再一次封装,不管怎么进行包装,还是会有获取链接、preparedStatement、封装参数、执行这些步骤的。

配置解析过程

String resource = "mybatis-config.xml";
//1.读取resources下面的mybatis-config.xml文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//2.使用SqlSessionFactoryBuilder创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.通过sqlSessionFactory创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

Resources.getResourceAsStream(resource)读取文件

public static InputStream getResourceAsStream(String resource) throws IOException {
 return getResourceAsStream(null, resource);
} 
//loader赋值为null
public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
 InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
 if (in == null) {
  throw new IOException("Could not find resource " + resource);
 } 
 return in;
}
//classLoader为null
public InputStream getResourceAsStream(String resource, ClassLoader classLoader) {
 return getResourceAsStream(resource, getClassLoaders(classLoader));
} 
//classLoader类加载
InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
 for (ClassLoader cl : classLoader) {
  if (null != cl) {
   //加载指定路径文件流
   InputStream returnValue = cl.getResourceAsStream(resource);
   // now, some class loaders want this leading "/", so we'll add it and try again if we didn't find the resource
   if (null == returnValue) {
    returnValue = cl.getResourceAsStream("/" + resource);
   } 
   if (null != returnValue) {
    return returnValue;
   }
  }
 } 
 return null;
}

总结:主要是通过ClassLoader.getResourceAsStream()方法获取指定的classpath路径下的Resource 。

面试必问|聊聊MyBatis执行流程?_第2张图片

面试必问|聊聊MyBatis执行流程?_第3张图片

面试必问|聊聊MyBatis执行流程?_第4张图片

面试必问|聊聊MyBatis执行流程?_第5张图片

面试必问|聊聊MyBatis执行流程?_第6张图片

面试必问|聊聊MyBatis执行流程?_第7张图片

面试必问|聊聊MyBatis执行流程?_第8张图片

面试必问|聊聊MyBatis执行流程?_第9张图片

面试必问|聊聊MyBatis执行流程?_第10张图片

面试必问|聊聊MyBatis执行流程?_第11张图片

面试必问|聊聊MyBatis执行流程?_第12张图片

面试必问|聊聊MyBatis执行流程?_第13张图片

面试必问|聊聊MyBatis执行流程?_第14张图片

面试必问|聊聊MyBatis执行流程?_第15张图片

面试必问|聊聊MyBatis执行流程?_第16张图片

面试必问|聊聊MyBatis执行流程?_第17张图片

面试必问|聊聊MyBatis执行流程?_第18张图片

面试必问|聊聊MyBatis执行流程?_第19张图片

面试必问|聊聊MyBatis执行流程?_第20张图片

面试必问|聊聊MyBatis执行流程?_第21张图片

面试必问|聊聊MyBatis执行流程?_第22张图片

面试必问|聊聊MyBatis执行流程?_第23张图片

面试必问|聊聊MyBatis执行流程?_第24张图片

面试必问|聊聊MyBatis执行流程?_第25张图片

面试必问|聊聊MyBatis执行流程?_第26张图片

面试必问|聊聊MyBatis执行流程?_第27张图片

面试必问|聊聊MyBatis执行流程?_第28张图片

面试必问|聊聊MyBatis执行流程?_第29张图片

执行doQuery

public  List doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
 Statement stmt = null;
 try {
  Configuration configuration = ms.getConfiguration();
  StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
  stmt = prepareStatement(handler, ms.getStatementLog());
  return handler.query(stmt, resultHandler);
 } finally {
  closeStatement(stmt);
 }
}

源码总结

总体上来说,MyBatis的源码还是比较简单的,只要大家踏下心来,花个两三天仔细研究下,基本上都能弄明白源码的主体脉络。为了方便小伙伴们理解,为大家整理了一个MyBatis整体执行的流程图。

面试必问|聊聊MyBatis执行流程?_第30张图片

你可能感兴趣的:(java,spring,android,编程语言,面试)