阅读mybatis源码

✿ 读mybatis的源码的思路

■ 1、 阅读源码的过程,应该阅读哪一个,哪一个是阅读重点呢?

  • 阅读源码构建会话工厂对象的源码,咱了解到:创建了一个SqlSessoinFactory会话工厂对象是通过默认的SqlSessoinFactory创建的,在创建的时候需要传入一个配置对象【即创建会话工厂对象的时候还创建了一个配置对象】,至此,研究一下配置对象的创建过程。
    在这里插入图片描述

  • 阅读源码构建会话工厂对象的源码,咱了解到:创建一个sqlSession会话对象是通过默认的sqlSession,在创建的时候需要传入三个参数,重点是观察哪个呢?

□ configuration 配置对象(在阅读会话工厂对象构建的源码的时候咱就了解过它了,不是重点)
□ executor 执行器(重点,因为在return 会话对象之前构建了executor执行器
□ autoCommit (是否提交,布尔值,不是重点)
在这里插入图片描述

  • 结合理解逻辑,还有return的提示作用,知道阅读重点是list的过程
    在这里插入图片描述

■ 阅读源码mybatis操作数据库的过程:

	/* 测试查询 */
	@Test
	public void testGet() throws IOException {
		// 1、从classpath路径加载mybatis全局配置文件mybatis-config.xml
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		// 2、创建SqlSessoinFactory会话工厂对象,好比连接池DataSource
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		SqlSessionFactory factory = builder.build(in);
		// 3、创建SqlSession会话对象,好比连接对象Connection
		SqlSession session = factory.openSession();
		// 4、获取mapper对象
		UserMapper mapper = session.getMapper(UserMapper.class);
		//执行sql操作
		User user = mapper.get(1L);
		System.out.println(user);
		// 5、关闭资源
		session.close();
	}

(1)创建SqlSessoinFactory会话工厂对象

  • 查看源码得知,表名上是创建了一个SqlSessoinFactory会话工厂对象, 实际上在创建SqlSessoinFactory会话工厂对象的时候还创建了一个全局配置对象。【咱还顺带看了一下全局配置的创建过程啦
    在这里插入图片描述

(2)创建SqlSessoin会话对象

  • 查看源码得知,表名上是创建了一个SqlSessoin会话对象, 实际上在创建SqlSessoin会话对象的时候还创建了一个全执行器对象。【咱还顺带看了一下执行器的创建过程啦

  • 执行器对象ExecutorCachingExcutor(Simple)带有缓存的执行器】,是mybatis的调度中心,负责sql的生成和查询缓存维护。在创建SqlSessoin会话对象创建,会执行pluginAll方法
    在这里插入图片描述

(3)创建mapper对象

  • 查看源码得知,创建mapper对象, 实际上通过jdk的代理机制创建了一个mapper的代理对象。
    在这里插入图片描述在这里插入图片描述

(4) 执行sql操作:mapper.get(1L);

  • 先判断传入的方法类型,不是Object类型,就使用映射方法进行执行
    在这里插入图片描述

  • 执行的时候会根据元素类型进行选择
    在这里插入图片描述

  • 咱执行mapper.get(1L)实际上是会话对象调用selectOne方法
    在这里插入图片描述

  • selectOne 返回一个集合list,观察selectList
    在这里插入图片描述

  • 映射语句mapperStatement封装了元素的信息
    在这里插入图片描述

  • 在selectList方法看到执行器调用查询方法
    在这里插入图片描述

  • 发现执行查询的过程,先经过CachingExcutor(带有二级缓存的执行器),先从二级缓存中寻找是否有数据
    在这里插入图片描述

  • 发现执行查询的过程,经过BaseExcutor(底层的执行器),先从一级缓存localCache中寻找是否有数据,若是没有在从数据库中查询
    在这里插入图片描述

  • 从数据库查询,是简单的执行器,调用doQuery方法
    在这里插入图片描述

  • 构建语句处理器对象
    在这里插入图片描述

  • 构建RoutingStatementHandler语句处理器对象
    在这里插入图片描述

  • 构建PreparedStatementHandler预编译语句处理器对象
    在这里插入图片描述

  • 构建ParameterHandler参数处理器对象、构建ParameterHandler参数处理器对象
    在这里插入图片描述



  • ★ Statement(PreparedStatement 预编译语句对象)创建对象之前,先创建参数处理器和结果处理器
    □ ParamterHandler 参数处理器,先把用户传入的参数转成JDBC需要的参数值,在创建对象之前,会执行pluginAll方法
    □ ResultSetHandler 结果集处理器,把结果集中的数据封装到list集合,在创建对象之前,会执行pluginAll方法
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 实例化一个语句对象
    在这里插入图片描述

。。。



✿ 总结阅读mybatis执行sql的源码中的核心对象:

  • InterceptorChaiin 拦截器链,多个拦截器合成

  • Configuration 全局配置对象,封装了所有的配置信息

  • Executor 执行器,myBatis的调度中心,负责sql生成和查询缓存维护,在创建sqlSession对象之前。创建ok之后,会执行pluginAll方法

    • BaseExecutor 底层的执行器,先从一级缓存中查询,若没有,则到数据库中查询
    • CachingExcutor(Simple) 带有二级缓存的执行器,先去二级缓存中寻找是否有数据
  • MappedStatement 映射语句对象,封装了一个元素节点(insert|delete|update|select)的信息

  • StatementHandler 语句处理器,封装了JDBC的DML/DQL操作,参数设置,在创建对象时,执行pluginAll方法

    • RoutingStatement
  • TypeHandler 类型转化器,把java类型和JDBC类型做相互转化操作,参数处理器、结果集处理器都会用到它。


■ 在创建StatementHandler 创建对象之前,先创建参数处理器和结果集处理器
□ ParameterHandler 参数处理器,把用户传入的参数转化为JDBC需要的参数值,在创建对象时,执行 pluginAll方法
□ ResultSetrHandler 结果集处理器,在结果集中的数据封装到List集合,在创建对象时,执行 pluginAll方法



在这里插入图片描述

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟庭大师兄

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值