热门框架系列 (二) -- MyBatis执行全流程;

另外一个大类就是cacheExecutor 是缓存执行器:

CacheExecutor其实是封装了普通的Executor,和普通的区别是在查询前先 会查询缓存中是否存在结果,如果存在就使用缓存中的结果,如果不存在还 是使用普通的Executor进行查询,再将查询出来的结果存入缓存。

我们可以通过openSession来确定自己 即将要使用的执行器; 这个在业务当中有很大作用; 现在我们代码使用的就是普通类型的执行器; 这边就不再累赘每个执行器的执行结果;


在这里插入图片描述

我们可以从返回对象得知 我们的Mapper对象 是代理对象; 既然有代理对象 那么 就一个有代理工厂 来生成这个代理对象; 我们由此引出2个对象MapperProxy

MapperProxyFactory;

在这里插入图片描述

在这里插入图片描述

这样就创建出来了代理Mapper; 我们继续往下走;

在这里插入图片描述

我们知道代理对象执行方法; 执行到MapperProxy 的 invoke 方法 源码不难; 我们解读一次;

public class MapperProxy implements InvocationHandler, Serializable {

private static final long serialVersionUID = -6424540398559729838L;

private final SqlSession sqlSession;

private final Class mapperInterface;

private final Map<Method, MapperMethod> methodCache;

构造方法

public MapperProxy(SqlSession sqlSession, Class mapperInterface, Map<Method, MapperMethod> methodCache) {

this.sqlSession = sqlSession;

this.mapperInterface = mapperInterface;

this.methodCache = methodCache;

}

执行主要方法;

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

try {

判断是否是一个对象; 如果是一个对象 就直接执行他的方法;

这个方法实际上就是Mapper的三种方式是有关系的;

if (Object.class.equals(method.getDeclaringClass())) {

return method.invoke(this, args);

} else if (isDefaultMethod(method)) {

return invokeDefaultMethod(proxy, method, args);

}

} catch (Throwable t) {

throw ExceptionUtil.unwrapThrowable(t);

}

最后走到这个地方; 引出一个对象 MapoperMethod

final MapperMethod mapperMethod = cachedMapperMethod(method);

return mapperMethod.execute(sqlSession, args);

}

private MapperMethod cachedMapperMethod(Method method) {

MapperMethod mapperMethod = methodCache.get(method);

if (mapperMethod == null) {

mapperMethod = new MapperMethod(mapperInterface, method, sqlSession.getConfiguration());

methodCache.put(method, mapperMethod);

}

return mapperMethod;

}

在这里插入图片描述

该对象是sql执行 的一个对象; 该对象带着sql的属性;带着返回值 我们可以从途中可以看出; 最后由mapperMethod.execute 执行

在这里插入图片描述

我们可以看出execute 会根据Type去判断 如果是select 就直接进select

这时候 DefaultSqlSession 就会去执行sql; 我们持续往下深挖;最后我们会到BaseExecutor.在这里插入图片描述

这里就会由模板模式去决定调取哪个 Executor

到此 我们Mybatis的全部流程 就讲解完了。

总结

==============================================================

Mybatis 是一个非常适合新手上手源码的框架 非常的简单;

  • SqlSessionFactoryBuilder解析配置文件,包括属性配置、别名配置、 拦截器配置、环境(数据源和事务管理器)、Mapper配置等;解析完这些 配置后会生成一个Configration对象,这个对象中包含了MyBatis需要的所 有配置,然后会用这个Configration对象创建一个SqlSessionFactory对 象,这个对象中包含了Configration对象;

  • 拿到SqlSessionFactory对象后,会调用SqlSessionFactory的 openSesison方法,这个方法会创建一个Sql执行器(Executor组件中包含 了Transaction对象),这个Sql执行器会代理你配置的拦截器方法。

  • 获得上面的Sql执行器后,会创建一个SqlSession(默认使用 DefaultSqlSession),这个SqlSession中也包含了Configration对象和上面 创建的Executor对象,所以通过SqlSession也能拿到全局配置;

  • 获得SqlSession对象后就能执行各种CRUD方法了


以上是获得SqlSession的流程,下面总结下本博客中介绍的Sql的执行流程:

  • 调用SqlSession的getMapper方法,获得Mapper接口的动态代理对 象MapperProxy,调用Mapper接口的所有方法都会调用到MapperProxy 的invoke方法(动态代理机制);

  • MapperProxy的invoke方法中唯一做的就是创建一个 MapperMethod对象,然后调用这个对象的execute方法,sqlSession会 作为execute方法的入参;

  • 往下,层层调下来会进入Executor组件(如果配置插件会对Executor 进行动态代理)的query方法,这个方法中会创建一个StatementHandler 对象,这个对象中同时会封装ParameterHandler和ResultSetHandler对 象。调用StatementHandler预编译参数以及设置参数值,使用 ParameterHandler来给sql设置参数


Executor组件有两个直接实现类,分别是BaseExecutor和 CachingExecutor。CachingExecutor静态代理了BaseExecutor。Executor 组件封装了Transction组件,Transction组件中又分装了Datasource组件。

  • 调用StatementHandler的增删改查方法获得结果,ResultSetHandler 对结果进行封装转换,请求结束。

Executor、StatementHandler 、ParameterHandler、 ResultSetHandler,Mybatis的插件会对上面的四个组件进行动态代理。


  • MapperRegistry:本质上是一个Map,其中的key是Mapper接口的 全限定名,value的MapperProxyFactory;

最后

为什么我不完全主张自学?
平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

[外链图片转存中…(img-KMSGJZBl-1720119302359)]

[外链图片转存中…(img-v8xUJGvP-1720119302359)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值