mybatis 06 映射体系 01

  1. 映射体系
    1. 获取属性值流程
  2. ResultMap结果集映射
    1. 手动映射
    2. 自动映射
  3. 延迟加载

映射体系

这个套体系功能很强大,底层基于java的反射

可以说,它不属于mybatis体系,我们通过学习掌握,可拿来做项目的底层工具包

获取属性值流程

查找属性

  • 基于”.”符号获取子属性:user.name
  • 基于索引获取列表值:users[1].id
  • 基于key获取map值:user[name]

设置属性

  • 可设置子属性值
  • 支持自动创建子属性(必须带有空参构造方法,且不能是集合)

我们以comments[0].user.name为例,这块代码比较复杂,大部分是递归机制。可基于此流程图做源码debug

在这套机制中,有几个类需要注意下:

类名 中文名称 亮点
BeanWrapper bean包装 名字带Wrapper的基本都是装饰器
PropertyTokenizer 属性分词器 迭代、递归
Reflector 反射器 反射工具类,内部做了缓存

ResultMap结果集映射

目的很简单,就是把数据库表格行和java bean对应起来

手动映射

这种方式比较麻烦,和当年写hbm.xml一样~

自动映射

默认不配置就是自动映射了,如果同时存在手动映射,那么优先手动映射

延迟加载

疑问,如果我们的查询出现循环依赖了怎么办?

以这种应用场景为例,博客的评论者是作者本人:

先了解下加载机制,打开DefaultResultSetHandler源码:

要解决循环依赖,mybatis引入了延迟加载机制(不是懒加载)。所谓的延迟加载,底层就是放入一个延迟加载列表中。deferredLoads是一个ConcurrentLinkedQueue

要了解延迟记载机制,我们先看看底层是如何实现嵌套机制的



当所有的查询都结束后,开始对延迟加载的内容进行加载。此时会命中一级缓存(这也是为什么一级缓存不能关闭的原因)


转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:mybatis 06 映射体系 01

字数:491

本文作者:夏来风

发布时间:2020-06-13, 10:10:19

原始链接:http://www.demo1024.com/blog/mybatis-06-mapping-01/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。