MyBatis源码分析一——核心对象

Mybatis的核心对象

一、Mybatis的核心对象及其作用

1.数据存储类对象
概念:在Java中(JVM)对Mybatis相关配置信息进行封装
目的:为了减少IO避免JVM与操作系统打交道,节省时间和资源,实现IO的复用等。
Mybatis-config.xml ----> Configuration
XXMapper.xml ----> MappedStatement (形象的认知,不准确)

Configuration类

  • 封装Mybatis-config.xml文件相关的内容
    (1)setting 标签对应的内容
    protected boolean safeRowBoundsEnabled;
    protected boolean safeResultHandlerEnabled = true;
    protected boolean mapUnderscoreToCamelCase;
    protected boolean aggressiveLazyLoading;
    protected boolean multipleResultSetsEnabled = true;
    protected boolean useGeneratedKeys;
    protected boolean useColumnLabel = true;
    protected boolean cacheEnabled = true;
    protected boolean callSettersOnNulls;
    protected boolean useActualParamName = true;
    protected boolean returnInstanceForEmptyRow;
    protected boolean shrinkWhitespacesInSql;
    
    (2)environment标签里面的内容
    protected Environment environment;
    
    (3)typeAlias标签里面的内容
    protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
    
    (4)mappers标签里面的内容
    protected final Set<String> loadedResources = new HashSet<>();
    
  • 封装了每个mapper.xml文件(对mapper文件里面的内容进行了汇总,便于之后使用)
	protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection")
      .conflictMessageProducer((savedValue, targetValue) ->
          ". please check " + savedValue.getResource() + " and " + targetValue.getResource());
  • 负责创建其他核心对象
    其他核心对象

MappedStatement类
MappedStatement并不是将每个mapper.xml文件封装为一个个对象,而是将每个文件内的每个CRUD标签单独封装成一个MappedStatement对象。标签里的属性就是MappedStatement类里面的属性。
mapper标签对应一个MappedStatement对象
在这里插入图片描述
在这里插入图片描述
有一点需要注意

// 这里的StatementType可以是以下三种Statement中的一种
private StatementType statementType;
//默认是PreparedStatement
mappedStatement.statementType = StatementType.PREPARED;

在这里插入图片描述
而且MappedStatement还对编写的sql语句进行了封装,封装到了BoundSql这个类里面了
在这里插入图片描述
进入这个类可以看到
在这里插入图片描述

还有一个小细节
在这里插入图片描述
两者是双向关联的关系,所以能通过MappedStatement也能找到Configuration。

  • 操作类对象
    Mybatis里面其实封装了很多操作类对象,表面看上去是SQLSession来帮我们完成了一系列的操作,其实是SqlSession调用了其他的一些操作类对象。如下图
    在这里插入图片描述
    接下来就来逐个分析其中的操作类对象
  • Executor
    Executor是Mybatis处理功能的核心
    主要功能
    a、增删改
    在这里插入图片描述
    b、查
    在这里插入图片描述
    c、事务操作(提交、回滚)
    在这里插入图片描述
    d、缓存相关的操作
    在这里插入图片描述
    Executor是一个接口,主要的实现类有一下三个
    BatchExecutor
    用于jdbc中的批处理操作
    ReuseExecutor
    用于Statement的复用,但Statement中的sql重复的概率很低,所以很少使用
    SimpleExecutor
    这是Mybatis里面默认使用的实现类,也是最常用的实现类
    在Configuration类里面有默认使用的配置
protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
  • StatementHandler
    StatementHandler是对Executor中对增删改查操作进一步的封装,目的是为了实现单一职责。它封装了JDBC中的Statement,是Mybatis对数据库访问操作的真正核心!

    StatementHandler也是一个接口,常用的实现类有三个
    SimpleStatementHandler(常用)
    CallableStatementHandler
    PreparedStatementHandler

  • ParameterHandler

  • ResultSetHandler

  • TypeHandler

未完待续

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值