当前位置: 首页 > news >正文

【MyBatis】源码学习 03 - 类型处理器 TypeHandler

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1、`type` 包中类的归类总结
      • 2、类型处理器
      • 2.1、`TypeReference` 类
      • 3、类型注册表
      • 3.1、`TypeHandlerRegistry#getTypeHandler`

前言

本文内容对应的是书本第 8 章的内容,主要是关于类型处理器 TypeHandler 的学习。

这一章节的学习有些地方理解还不算深入,Debug 之后还是有些不太能够理解的地方,到了后面的章节深入学习之后,再回头看希望会有新的收获。

参考目录

  • 《通用源码阅读指导书:MyBatis源码详解》
    本文主要内容来自 第8章 type包

与上篇一样,需要说明的是,书中使用的框架版本和本文(本专栏)使用的版本不一样。

名称书中版本专栏版本
MyBatis3.5.23.5.11+
Spring Boot2.X3.X
JDK817+

随着版本的升级迭代,会有一些内容不尽相同,需要结合着进行学习。

学习笔记

1、type 包中类的归类总结

本章开篇首先对包中的所有类进行了分类,因为篇幅比较长,所以我整理了以下表格方便以后查阅。

组别数量类名称说明
类型处理器1接口
1基础实现类
1辅助类
43实现类
1接口:TypeHandler
1基础实现类:BaseTypeHandler
1辅助类:TypeReference
43实现类:*TypeHandler
TypeHandler:类型处理器接口
BaseTypeHandler:类型处理器基础实现
TypeReference:类型参考器
*TypeHandler:类型处理器
类型注册表3SimpleTypeRegistry
TypeAliasRegistry
TypeHandlerRegistry
SimpleTypeRegistry:基本类型注册表
TypeAliasRegistry:类写别名注册表
TypeHandlerRegistry:类型处理器注册表
注解3@Alias
@MappedJdbcTypes
@MappedTypes
@Alias:设置别名
@MappedJdbcTypes:配置JDBC类型处理器
@MappedTypes:配置Java类型处理器
异常类1TypeException类型处理相关异常
工具类1ByteArrayUtils数组转换工具
枚举1JdbcTypeJDBC类型

本章的着重点在于表格前两组,即 类型处理器 以及 类型注册表

2、类型处理器

类型处理器的设计使用了模板模式。

这里是引用

2.1、TypeReference

在这里插入图片描述

3、类型注册表

类型注册表一共三个,分别是 SimpleTypeRegistryTypeAliasRegistryTypeHandlerRegistry

SimpleTypeRegistry 是一个非常简单的注册表,其内部使用一个SIMPLE_TYPE_SET变量维护所有 Java基本类型。

在这里插入图片描述

TypeAliasRegistry是一个类型别名注册表,其内部使用 typeAliases变量维护类型的别名与类型的对应关系。

在这里插入图片描述

TypeHandlerRegistry 是这三个注册表中最为核心的一个,数据类型和相关处理器的对应关系就是由它维护的。

在这里插入图片描述

运行时保存的内容:

// JDBC 类型与对应类型处理器的映射
private final Map<JdbcType, TypeHandler<?>> jdbcTypeHandlerMap = new EnumMap<>(JdbcType.class);

在这里插入图片描述

// Java 类型与 Map<JdbcType, TypeHandler<?>> 的映射
private final Map<Type, Map<JdbcType, TypeHandler<?>>> typeHandlerMap = new ConcurrentHashMap<>();

在这里插入图片描述

3.1、TypeHandlerRegistry#getTypeHandler

在这里插入图片描述

这里是引用

在这里插入图片描述

在这里插入图片描述

(完)

http://www.lryc.cn/news/11914.html

相关文章:

  • 建造《流浪地球2》中要毁灭人类的超级量子计算机MOSS的核心量子技术是什么?
  • 数据结构~七大排序算法(Java实现)
  • python练习
  • RPC-thrift实践
  • Maven:工程的拆分与聚合
  • 使用uniapp创建小程序和H5界面
  • 密度峰值聚类算法(DPC)
  • RabbitMQ相关问题
  • 操作系统 三(存储管理)
  • day34 贪心算法 | 860、柠檬水找零 406、根据身高重建队列 452、用最少数量的箭引爆气球
  • 使用canvas给上传的整张图片添加平铺的水印
  • [安装之4] 联想ThinkPad 加装固态硬盘教程
  • Java数据类型、基本与引用数据类型区别、装箱与拆箱、a=a+b与a+=b区别
  • GoLang设置gofmt和goimports自动格式化
  • 【k8s】如何搭建搭建k8s服务器集群(Kubernetes)
  • DIDL4_前向传播与反向传播(模型参数的更新)
  • 链表学习之链表划分
  • (考研湖科大教书匠计算机网络)第五章传输层-第一、二节:传输层概述及端口号、复用分用等概念
  • C#:Krypton控件使用方法详解(第七讲) ——kryptonHeader
  • 5年软件测试工程师分享的自动化测试经验,一定要看
  • 什么是猜疑心理?小猫测试网科普小作文
  • Redis命令行对常用数据结构String、list、set、zset、hash等增删改查操作
  • mycobot 使用教程
  • JVM学习总结,虚拟机性能监控、故障处理工具:jps、jstat、jinfo、jmap、Visual VM、jstack等
  • 指针笔记(指针数组和指向数组的指针,数组中a和a的区别等)
  • MySQL ---基础概念
  • 【基础】Flink -- ProcessFunction
  • JavaEE|网络编程基础与Socket套接字
  • 【SpringBoot】基础协议及邮件配置整合
  • pytorch配置—什么是CUDA,什么是CUDNN、在配置pytorch虚拟环境中遇到的问题、在安装gpu—pytorch中遇到的问题