MyBatis 的运行原理

MyBatis的运行过程分为两大步:

第1步:读取配置文件缓存到 Configuration 对象,用于创建SqlSessionFactory;

第2步:SqlSession的执行过程,相对而言,SqlSessionFactory的创建还算比较容易理解,而 SqlSession的执行过程就不那么简单了,它包括许多复杂的技术,要先掌握反射技术和动态代理,里主要用到的是JDK 动态代理,不熟悉的话请点击这里了解一下。

(1)构建 SqlSessionFactory 过程:

SqlSessionFactory 是MyBatis 的核心类之一,其最重要的功能就是提供创建 MyBatis 的核心接口 sqISession,所以首先创建SqlSessionFactory,为此要提供配置文件和相关的参数。MyBatis是一个复杂的系统,它采用了Builder 模式去创建SqlSessionFactory,在实际中课通过 SqlSessionFacyoryBuilder去创建,构建分为两步:

1.通过 org-apache.ibatis.builder.xml.XMLConfigBuilder 解析配置的 XML 文件读取所配置的参数并将读取的内容存入Configuration类对象中。而Configuration采用的是单例模式,几乎所有的MyBatis配置内容都会存放在这个单例对象中

2.使用 Configuration 对象去创建SqlSessionFactory。MyBatis 中的 SqlSessionFactory是一个接口,而不是一个实现类,为此 MyBatis 提供了一个默认的实现类 DefaultSglSessionFactory,在大部分情况下没有必要自己去创建新的实现类。

这种创建的方式就是一种 Builder模式,对于复杂的对象而言,使用构造器参数很难实现,使用一个类(比如Configuration)作为统领,一步步构建所需的内容,然后通过它去创建最终的对象(比如 SqlSessionFactory),这样每一步都会很清晰。

(2)构建 Configuration:

在SqlSessionFactory构建中,Configuration 是最重要的,它的作用是:

读入配置文件,包括基础配置的Xml和映射器XML(或注解),初始化一些基础配置,比如MyBatis利名等,一些重要的类对象(如插件、映射器 Object 工厂等)提供单例,为后续的创建 SessionFacton

服务提供配置的参数,显然Configuration 不会是一个简单的类,MyBatis的配置信息都来自于此,首先他会读出 XML配置的信息,然后把它们保存在Configuration 单例中,它会做如下初始化, properties 全局参数 typeAliases 别名 Plugins 插件

objectFactory 对象工厂 reflectionFactory 反射工厂 settings 环境设置

environment 数据库环境

databaseldProvider 数据库标识 Mappers 映射器

他们都会以类似 typeHandler 注册那样的方法被存放到 Configuration 单例,以便将来取出。(3)构建映射器的内部组成

当XMLConfiguration解析XML是会将每一个SQL和其配置的内容保存起来。一般而言,在MyBatis中一条sQL和它相关的配置是有3个部分组成的,它们分别是 MappedStatement、SqISource和 BoundSql。

MappedStatement 的作用保存一个映射器节点(select| insert|delete | update)的内容。它是一个类,包括许多我们配置的SQL、SQL的id、缓存信息、resultMap、parameterType、resultType 等重要的配置信息,它还有一个重要的属性 sqlSource。MyB 通过它来获取某条 SQL 配置的所有信息。

SqlSource 是提供 BoundSql 对象的地方,它是 MappedStatement 的一个重要属性。注意,它是一个接口,而不是一个实现类。它有几个重要的实现类:DynamicSqlSource、ProviderSqlSource RawSqISource、StaticSqlSource。它的作用是根据上下文和参数解析生成需要的 SQL,这个接口只定义了一个接口方法一…getBoundSql(parameterObject),使用它就可以得到一个 Boundsql 对象。

BoundSql是一个结果对象,也就是 SqlSource 通过对 SQL 和参数的解析得到的 SQL 和参数,它是建立 SQL和参数的地方,他有常用的3个属性:sql、parameterObject、parameterMappings

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值