MyBatis 解析和运行原理

SqlSessionFactory 构建过程

MyBatis采用构造模式去创建SqlSessionFactory,构建过程分为两步:

  1. 通过 org.apache.ibatis.builder.xml.XML.ConfigBuilder 解析XML文件,读取配置参数,并将配置存入org.apache.ibatis.session.Configuration类中
  2. 使用Configuration对象去创建SqlSessionFactory(DefaultSqlSessionFactory), 大部分情况下没有必要自己去创建新的SqlSessionFactory

对于复杂对象而言,直接使用构造方法构建是有困难的,这会导致大量的逻辑放在构造方法中,由于对象的复杂性,在构建的时候,使用构建模式有秩序的来构建他们从而降低复杂性

 

构建 Configuration

在SqlSessionFactory构建中,Configuration是最重要的,作用如下

  • 读入配置文件,包括基础配置的XML文件和映射器的XML文件
  • 初始化基础配置,别名、插件、映射器、ObjectFactory和typeHandler等
  • 提供单例,为后续创建SessionFactory服务并提供配置的参数
  • 执行一些重要的对象方法,初始化配置信息

MyBatis的配置信息都来自于Configuration

Configuration通过XMLConfigBuilder去构建的,MyBatis会读出所有XML配置信息,然后将这些信息保存到Configuration类的单例中

XMLConfigBuilder构建Configuration会做如下初始化:

  • properties 全局参数
  • settings 设置
  • typeAlias 别名
  • typeHandler 类型处理器
  • ObjectFactory 对象
  • plugin 插件
  • environment 环境
  • DatabaseIdProvider 数据库标识
  • Mapper 映射器

映射器的内部组成

一个映射是由3个部分组成:

  • MappedStatement: 它保存一个映射节点(select|insert|delete|update),包括SQL、id信息、缓存信息、resultMap、resultType、languageDriver等配置内容
  • SqlSource: 它是提供BoundSql对象的地方,它是MappedStatement的一个属性,主要作用是根据参数和其他的规则组装SQL
  • BoundSql:它是建立SQL和参数的地方,参数和SQL主要规则反映在BoundSql类对象上

BoundSql3个常用属性:sql、parameterObject、parameterMappings

parameterObject为参数本身

  • 传递简单对象时(int、double、long),MyBatis会把参数变为封装类型(Integer、Double、Long)对象进行传递
  • 如果我们传递的是POJO或Map,那么parameterObject就传入POJP或者MAP,不变
  • 传递多个参数时,如果没有@Param注解,那么就会把parameterObject变为一个Map<String,Object>对象,键值管事是按顺序来规划的{"1":p1,"2":p2,"3":p3,"param1":p1,"param2":p2,"param3":p3},在编写的时候我们可以使用#{param1}或者#{1} 进行引用第一个参数
  • 传递多个参数时,如果使用了@Param注解,parameterObject会变为一个Map<String,Object>对象,那么MyBatis就会把@Param的key放入Map<String,Object>中

parameterMappings 

是一个list,每一个元素都是ParameterMapping对象,这个对象会描述我们的参数,一般不需要改变它,通过它可实现参数和SQL的结合

sql

就是我们书写在映射器里的一条SQL,大多数时候无需修改,可以根据需要进行改写

 

构建 SqlSessionFactory

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);

 

SqlSession运行过程

映射器的动态代理

Mapper映射器是通过动态代理来实现的

MapperProxyFactory作用是生成代理对象,将代理对象放到了MapperProxy中,invoke方法中通过cachedMapperMethod对Mapper进行初始化,然后执行excute方法,把SqlSession和当前运行的参数传递进去

在execute方法中MeperMethod 采用命令模式运行,在里面可以看到executeForMany方法,实际上最后就是通过SqlSession对象去运行对象的SQL

 

最后映射器的XML文件的命名空间对应的便是这个接口的全路径,那么它根据全路径和方法名能够绑定起来,通过动态代理技术让接口跑起来,然后采用命令模式,最后还是使用SqlSession接口的方法执行对象的SQL

 

SqlSession下的四大对象

  • Executor 执行器,由他来调度StatementHandler、ParameterHandler、ResultHandler等来执行对应的SQL
  • StatementHandler 的作用是使用数据库的Statement(PreapredStatement)执行操作,是四大对象的核心,起到承上启下的作用
  • ParameterHandler用于SQL对参数的处理
  • ResultHandler是进行最后数据集(ResultSet)的封装返回处理

SqlSession是通过Executor创建StatementHandler来运行的,而StatementHandler要经过以下三步:

  • prepared预编译SQL
  • parameterize设置参数
  • query/update执行SQL

其中parameterize是调用parameterHandler的方法区设置的,而参数是根据类型处理器typeHandler去处理的

query/update方法是通过resultHandler进行处理结果的封装,然后用ObjectFactory提供的规则组装对象,返回给调用者

 

posted @ 2020-11-13 20:04  半雨微凉  阅读(300)  评论(0)    收藏  举报