另外一个大类就是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)]