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

6feeab9d62162092bf359b7d04f8febc.png

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

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

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

本文主要结构如下所示。

715ad643f8630dcf6eaa64c81f5988db.png

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 。

430626c78ae886972c9dfe3320bf5f52.png

29fc83a83e761443ec6c8c583ee7036f.png

e23e666736b23e626594ff9a4af8e44e.png

9a1d2a4f9a958183d61d1d7d5cdf9ca8.png

812a189a53f7046406a0e899bfa5e214.png

681508a22f588953cc188756f49d738f.png

6d45119f64ea70ba9dafca3479e6f148.png

e6ee3a844234a9c6c7c8171751b1a88b.png

ae1aaabe5c09d0977f84688b4e12a9d2.png

b5763d5265d52cf00cf2b0d54b57caea.png

025105a429366616326911a4cebf7688.png

4b2b7feeea5a288b8d1677df9a1c66a9.png

b7d4f36488a36a826f492c0d902c5ed1.png

d5a0a69f86bc7bb25f1594c72b501b23.png

e8e0de7a02ea6fa0098402ce6392d416.png

817440b56fe261888c171c5644dcfaec.png

98ff6f44e32ced033f09da3d4cf2866e.png

c62db65fbd20eb8b9bb3f0a53c596893.png

c785baecb8de900da917543289f75b82.png

954b34773e334b4885825c9cef946984.png

a47d4c7612e781dc6b95ddc7ff557b5d.png

d306987d239dd544f51543d408b45385.png

95ffa6059239555ad2a2131ff9eb7b2e.png

89a777fa5f3ad9700e19c6c36b72c827.png

5855f004a8d93678a57c16be60cc4be3.png

f0fdcead41d1c4a8f7d838e523e879f0.png

2718b7c7ff6b04309d2cc48a8b604e72.png

0a884435776e0d9129836c1a00ce6c0b.png

执行doQuery
public <E> List<E> 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整体执行的流程图。

fb29ab26d1bc7bdf8f02a198ed0b0c8b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值