mybatis学习记录6typehandler

abcwt112的博客园      2022-04-15     394

关键词:

主题

  因为对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,所以就记录并学习一下TypeHandler.

 

使用场景

如上图所示,观察下接口方法就能明白.TypeHandler主要用于JDBC数据与Java对象数据之间转化,比如更新数据库的时候可以设置java对象里的字段怎么映射到JDBC数据库支持的类型.或者查询数据的时候,返回的JDBC的数据怎么转化成Java对象中的属性.

这篇文章主要以一个select查询为例,学习下TypeHandler都被应用在了哪些阶段? 怎么被使用的.

 

 

初始化阶段

正如之前文章分享的那样.MyBatis在初始化build SqlSessionFactory的时候会解析一大堆东西,生成Configuration.内置的TypeHandler在这个阶段被初始化.

如上图, new Configuration的时候会初始化TypeHandlerRegistry.

而这个Registry的构造方法就是注册各种内置的TypeHandler的地方.

如上图所示, register方法用于向TypeHandlerRegistry的成员域(Map)里注册TypeHandler.

register方法被重载了N多次.但是可以归纳为大致几种作用.

在此之前先介绍下TypeHandlerRegistry的几个成员域.因为register方法与他们密不可分.

JDBC_TYPE_HANDLER_MAP key为JDBC类型 Value是TypeHandler
TYPE_HANDLER_MAP    key是Java的Class类型,比如String.class, Value是1个Map,Key是JDBC类型,Value是TypeHandler. Value的key可以为null
ALL_TYPE_HANDLERS_MAP key是TypeHandler的Class类型, Value是TypeHandler

 

register有很多重载的方法.小结一下的话大约有2个分支:
register(Type javaType, JdbcType jdbcType, TypeHandler<?> handler)
这个方法就是
1. 为1个Java类型添加对应的JDBC类型与handler. 主要是往TYPE_HANDLER_MAP里添加数据
2. 记录有哪些TypeHandler.即往ALL_TYPE_HANDLERS_MAP中里面添加数据.
它的一个变体是register(Type javaType, TypeHandler<? extends T> typeHandler)这个方法. 没有传JdbcType. 在这种情况下会扫描Handler上面的MappedJdbcTypes注解,找到这个handler对应的JdbcType.

当然也有类似public <T> void register(TypeHandler<T> typeHandler)这种变体.会扫描Handler上面的MappedTypes注解,找到对应的javaType.

 

register(JdbcType jdbcType, TypeHandler<?> handler) 这个分支是不传Java Type变量的.
这个分支就比较简单了.往JDBC_TYPE_HANDLER_MAP中加入数据
 
 
除了内置的TypeHandler自己也可以设置自定义的TypeHandler

在初始化的解析conf的时候会解析

这个代码比较简单,直接看就能明白.唯一要注意的是是先初始化自带的typeHandler.再加载自定义的typeHandler.所以自己定义的可能会覆盖mybatis内置的.

 
至此,TypeHandlerRegistry就已经完成了注册handler的任务了.
 
 

解析Mapper阶段

其实这个也算是初始化阶段...在解析完自定义的typeHandler之后需要解析Mapper

解析Mapper中有1个很重要的步骤就是解析resultMap.

resultMap里需要指定JavaType与JdbcType之间的映射.

那么如果不指定的时候呢?

因为知道jdbcType和Java类型(property),所以会调用这个方法找到对应的TypeHandler

从上图我们也可以发现,知道了JavaType会取到jdbcType为key, Handler为Value的Map.然后从Map中根据jdbcType去找对应的handler.如果没有,那就使用null作为key去找.相当于null为key得到的是一种不指定JdbcType的通用handler.

如果还没有就做pickSoleHandler方法,取对应的handler(如果这个JavaType只有唯一一个handler,那就取这个,不然就返回null).如此就确定了handler是哪个了.

 

当做selectByPrimaryKey的时候就会调用对应的方法做JAVA->JDBC的类型转化(java Int -> mysql integer)

 

同样道理,得到结果集映射到Java对象的时候也会掉相应的方法

 

 
 
 

 

mybatis学习记录~

mybatis版本<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency> 动态SQL语句 IF标签<selec 查看详情

mybatis学习记录5mybatis的二级缓存

 主题  之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类.现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情首先二级缓存默认是不开启的,需要自己配置开启.如上图,需要在configuration里去... 查看详情

mybatis学习记录------4

一mybatis开发dao的方法1SqlSessionFactoryBuilder:通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory,将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次Sq... 查看详情

mybatis学习记录------3

一删除用户1映射文件<!--删除用户根据ID删除用户--><deleteid="deleteUser"parameterType="java.lang.Integer">deletefromuserwhereid=#{id}</delete>2测试@TestpublicvoiddeleteUserTest()throwsIOException{//Mybatis 查看详情

mybatis学习过程记录(代码片段)

一、Mybatis1、mybatis-config.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/myba 查看详情

mybatis学习记录------2

 一 单条记录查询上篇博客的例子便是单条记录查询二多条记录查询1在映射文件中加入如下sql查询,${}:表示拼接sql串,将接收到的参数不加任何修饰拼接在sql中,${value}:接收输入参数的内容,如果传入类型是简单类型,$... 查看详情

mybatis学习记录3mappermethod类

主题  之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMethod.execute(sqlSession,args);所以想再简单学习记录下MapperMethod类 组成从... 查看详情

mybatis源码学习记录

1、mybatis源码分析相关文章(1)https://www.cnblogs.com/zhjh256/p/8512392.html2、mybatis设计模式相关文章(1)http://www.crazyant.net/2022.html?hmsr=toutiao.io&utm_medium=toutiao.io&am 查看详情

mybatis结果映射与mybatis缓存初探学习记录(代码片段)

MyBatis高级结果映射(一对一、一对多、多对多的映射),延迟加载,查询缓存(一级缓存),二级缓存的学习记录;1、学习中所使用到的例子,数据库基础分析2、高级结果映射3、延迟加载4、... 查看详情

mybatis原理分析学习记录(代码片段)

以下个人学习笔记,仅供参考,欢迎指正。MyBatis是支持定制化SQL、存储过程以及高级映射的持久层框架,其主要就完成2件事情:封装JDBC操作利用反射打通Java类与SQL语句之间的相互转换MyBatis的主要设计目的就是让我们对执行SQL... 查看详情

mybatis学习记录------1

一认识mybatismybatis是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM(对象,关系映射)实现。其封装性要低于Hibernate,性能优越,并且小巧、简单易学,应用也越来越广泛。二搭建mybatis... 查看详情

mybatis学习过程记录(代码片段)

一、Mybatis1、mybatis-config.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--外部引入db--><propertiesresourc... 查看详情

employeemapper.xml例子,学习佟刚老师的mybatis课程,记录下的employeemapper.xml,注释详细

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.atguigu.mybatis.dao.Employ 查看详情

mybatis学习笔记一

  昨天看了一下mybatis,学习了一下有很多东西还不懂,但是想把一些知道的记录一下,如有错误请大家多多指点。   mybatis它是apche的一个开源项目,它以前的没名字并不是叫mybatis而是叫ibatis,2010年这个项目由apachesoftwarefound... 查看详情

mybatis学习

什么是MyBatis?MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJ... 查看详情

mybatis入门学习

一、MyBatis入门简要介绍(百科)  MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接... 查看详情

我的日常报错学习记录

...先继续写下去,结果到了mapper层,无法导出@mapper的包,mybatis.xml也报错,开始排查错误,发现是mybatis版本过高。将2.0.0改成1.3.2即可,报错消失,@mapper可以导出包。但是我的mybatis.xml还在报错啊~~~~~继续改错去~~~~  查看详情

mybatis学习

前言感觉学习进度还是比较慢啊,一整天的学习效率不是很高,一会看电视,一会喝茶,对自己的要求不严格...今天就说说关联表数据的插入以及别名的使用。正文1.关联插入  之前,我在数据库中已经创建了一张users表,现... 查看详情