原文:https://juejin.im/post/5abcbd946fb9a028d1412efc
本篇文章是「深入浅出MyBatis:技术原理与实践」书籍的总结笔记。
上一篇介绍了反射和动态代理基础,主要是为本篇文章做个铺垫,反射使配置和灵活性大大提高,可以给很多配置设置参数,动态代理可以在运行时创建代理对象,做一些特殊的处理。
文章索引:
- JDBC和MyBatis介绍
- MyBatis的所有配置
- 「映射器」全了解
- 反射和动态代理基础
- MyBatis插件和开发过程
本篇会介绍MyBatis解析和运行原理,下一篇介绍插件及应用,目的是更好地编写插件,通过本篇的介绍,你会了解到:
- 构建SqlSessionFactory过程
- 映射器的动态代理
- SqlSession的4大对象
- sql执行的过程
SqlSessionFactory和SqlSession是MyBatis的核心组件,在文章 JDBC和MyBatis介绍 中有详细说明。
构建SqlSessionFactory过程
构建主要分为2步:
- 通过XMLConfigBuilder解析配置的XML文件,读出配置参数,包括基础配置XML文件和映射器XML文件;
- 使用Configuration对象创建SqlSessionFactory,SqlSessionFactory是一个接口,提供了一个默认的实现类DefaultSqlSessionFactory。
说白了,就是将我们的所有配置解析为Configuration对象,在整个生命周期内,可以通过该对象获取需要的配置。
由于插件需要频繁访问映射器的内部组成,会重点这部分,了解这块配置抽象出来的对象:
MappedStatement
它保存映射器的一个节点(select|insert|delete|update),包括配置的SQL,SQL的id、缓存信息、resultMap、parameterType、resultType等重要配置内容。
它涉及的对象比较多,一般不去修改它。
SqlSource
它是MappedStatement的一个属性,主要作用是根据参数和其他规则组装SQL,也是很复杂的,一般也不用修改它。
BoundSql
对于参数和SQL,主要反映在BoundSql类对象上,在插件中,通过它获取到当前运行的SQL和参数以及参数规则,作出适当的修改,满足特殊的要求。
BoundSql提供3个主要的属性:parameterObject、parameterMappings和sql,下面分别来介绍。
parameterObject为参数本身,可以传递简单对象、POJO、Map或@Param注解的参数:
- 传递简单对象(int、float、String等),会把参数转换为对应的类,比如int会转换为Integer;
- 如果传递的是POJO或Map,paramterObject就是传入的POJO或Map不变;
- 如果传递多个参数,没有@Param注解,parameterObject就是一个Map对象,类似这样的形式{"1":p1 , "2":p2 , "3":p3 ... "param1":p1 , "param2":p2 , "param3