一、什么是类型处理器

1、类型处理器(TypeHandler)

MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。说人话,也就是java类型与jdbc类型之间的处换器,诸如最常见StringTypeHandler。

2、Mybatis内置了哪些类型处理器

如下图,类型处理器的顶级接口是org.apache.ibatis.type.TypeHandler

下表描述了一些默认的类型处理器,官方原表。

类型处理器 Java 类型 JDBC 类型
BooleanTypeHandler java.lang.Boolean, boolean 数据库兼容的 BOOLEAN
ByteTypeHandler java.lang.Byte, byte 数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandler java.lang.Short, short 数据库兼容的 NUMERIC 或 SMALLINT
IntegerTypeHandler java.lang.Integer, int 数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandler java.lang.Long, long 数据库兼容的 NUMERIC 或 BIGINT
FloatTypeHandler java.lang.Float, float 数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandler java.lang.Double, double 数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandler java.math.BigDecimal 数据库兼容的 NUMERIC 或 DECIMAL
StringTypeHandler java.lang.String CHAR, VARCHAR
ClobReaderTypeHandler java.io.Reader -
ClobTypeHandler java.lang.String CLOB, LONGVARCHAR
NStringTypeHandler java.lang.String NVARCHAR, NCHAR
NClobTypeHandler java.lang.String NCLOB
BlobInputStreamTypeHandler java.io.InputStream -
ByteArrayTypeHandler byte[] 数据库兼容的字节流类型
BlobTypeHandler byte[] BLOB, LONGVARBINARY
DateTypeHandler java.util.Date TIMESTAMP
DateOnlyTypeHandler java.util.Date DATE
TimeOnlyTypeHandler java.util.Date TIME
SqlTimestampTypeHandler java.sql.Timestamp TIMESTAMP
SqlDateTypeHandler java.sql.Date DATE
SqlTimeTypeHandler java.sql.Time TIME
ObjectTypeHandler Any OTHER 或未指定类型
EnumTypeHandler Enumeration Type VARCHAR 或任何兼容的字符串类型,用来存储枚举的名称(而不是索引序数值)
EnumOrdinalTypeHandler Enumeration Type 任何兼容的 NUMERIC 或 DOUBLE 类型,用来存储枚举的序数值(而不是名称)。
SqlxmlTypeHandler java.lang.String SQLXML
InstantTypeHandler java.time.Instant TIMESTAMP
LocalDateTimeTypeHandler java.time.LocalDateTime TIMESTAMP
LocalDateTypeHandler java.time.LocalDate DATE
LocalTimeTypeHandler java.time.LocalTime TIME
OffsetDateTimeTypeHandler java.time.OffsetDateTime TIMESTAMP
OffsetTimeTypeHandler java.time.OffsetTime TIME
ZonedDateTimeTypeHandler java.time.ZonedDateTime TIMESTAMP
YearTypeHandler java.time.Year INTEGER
MonthTypeHandler java.time.Month INTEGER
YearMonthTypeHandler java.time.YearMonth VARCHAR 或 LONGVARCHAR
JapaneseDateTypeHandler java.time.chrono.JapaneseDate DATE

二、如何自定义类型处理器

尽管mybatis提供了许多类型处理器,但有时由于业务的需要,需要自定义类型处理器。例如,java实体类中Long[]数组类型如何以JSON字符串格式存储到数据库中varchar中,又如何能正常查询出,此时就需要自定义类型了。

1、写个处理器

实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler, 并且可以(可选地)将它映射到一个 JDBC 类型

是否要指定javaType与jdbcType?

官方解释:要注意 MyBatis 不会通过检测数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明字段的jdbcType,以使其能够绑定到正确的类型处理器上。这是因为 MyBatis 直到语句被执行时才清楚数据类型。

关于javaType的指定,通过类型处理器的泛型,MyBatis 可以得知该类型处理器处理的 Java 类型,不过这种行为可以通过两种方法改变:

  • 在类型处理器的配置元素(typeHandler 元素)上增加一个 javaType 属性(比如:javaType=“String”);
  • 在类型处理器的类上增加一个 @MappedTypes 注解指定与其关联的 Java 类型列表。 如果在 javaType 属性中也同时指定,则注解上的配置将被忽略。

关于jdbcType的指定,可以通过两种方式来指定关联的 JDBC 类型:

  • 在类型处理器的配置元素上增加一个 jdbcType 属性(比如:jdbcType=“VARCHAR”);
  • 在类型处理器的类上增加一个 @MappedJdbcTypes 注解指定与其关联的 JDBC 类型列表。 如果在 jdbcType 属性中也同时指定,则注解上的配置将被忽略。

当在 ResultMap 中决定使用哪种类型处理器时,此时 Java 类型是已知的(从结果类型中获得),但是 JDBC 类型是未知的。 因此 Mybatis 使用 javaType=[Java 类型], jdbcType=null 的组合来选择一个类型处理器。 这意味着使用 @MappedJdbcTypes 注解可以限制类型处理器的作用范围,并且可以确保,除非显式地设置,否则类型处理器在 ResultMap 中将不会生效。 如果希望能在 ResultMap 中隐式地使用类型处理器,那么设置 @MappedJdbcTypes 注解的 includeNullJdbcType=true 即可。 然而从 Mybatis 3.4.0 开始,如果某个 Java 类型只有一个注册的类型处理器,即使没有设置 includeNullJdbcType=true,那么这个类型处理器也会是 ResultMap 使用 Java 类型时的默认处理器。

2、配置处理器

  • 全局配置,在mybatis配置文件中配置

  • 局部配置,只针对某个字段处理,查与增删改使用的typeHandler要保持一致
    查:在resultMap中指定字段的typeHandler

    增删改:使用 #{} 指定typeHandler

3、验证处理器

数据库:

实体类:

查询结果:

插入结果:

【Mybatis】类型处理器TypeHandler的作用与自定义相关推荐

  1. Mybatis——类型处理器TypeHandler

    在日常开发中使用mybatis时,mybatis的mapper.xml.mapper接口.entity实体一般会由mybatis-generator自动生成,其中实体的每个属性与数据库表的列一一对应, ...

  2. MyBatis(九):MyBatis类型处理器(TypeHandler)详解

    TypeHandler简介 TypeHandler,顾名思义类型转换器,就是将数据库中的类型与Java中的类型进行相互转换的处理器. MyBatis 在设置预处理语句(PreparedStatemen ...

  3. MyBatis自定义类型处理器 TypeHandler

    在项目开发中经常会遇到一个问题: 当我们在javabean中自定义了枚举类型或者其它某个类型,但是在数据库中存储时往往需要转换成数据库对应的类型,并且在从数据库中取出来时也需要将数据库类型转换为jav ...

  4. MyBatis-Plus——字段类型处理器TypeHandler

    字段类型处理器(TypeHandler) 1,准备工作 (1)MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换,假设我们用户表中有一个联 ...

  5. MyBatis类型处理器注册器TypeHandlerReister

    一.引言 我们知道 mysql的类型和java类型有对应关系,参考此文:https://www.cnblogs.com/jerrylz/p/5814460.html. 那么mybatis是怎么找到这种 ...

  6. 类型处理器TypeHandler

    作用:用于JavaType和JdbcType之间的转换 解析:当Mybatis将一个Java对象写入数据库时,它会创建一个PreparedStatument对象,并且使用setValue()方法对占位 ...

  7. desc 枚举类型id_想让代码更优雅?Mybatis类型处理器了解一下!

    明确需求 在设计之初,sys_role表的enabled字段有2个可选值,其中0 代表禁用,1代表启用,而且实体类中我们使用的是Interger类型: 源码展示 /** * 有效标志 */ priva ...

  8. Ibatis的类型处理器TypeHandler解析

    Ibatis允许用户像在hibernate中一样定义自己的类型,但是,用户自定义类型需要与数据库中的字段类型进行对应.它的处理方法是允许我们扩展TypeHandler.Ibatis框架在处理该数据类型 ...

  9. MyBatis核心源码剖析(SqlSession XML解析 Mapper executor SQL执行过程 自定义类型处理器 缓存 日志)

    MyBatis核心源码剖析 MyBatis核心源码剖析 1 MyBatis源码概述 1.1 为什么要看MyBatis框架的源码 1.2 如何深入学习MyBatis源码 1.3 源码分析的5大原则 2 ...

最新文章

  1. python 基础知识点整理 和详细应用
  2. 皮一皮:一直情绪不稳的原因终于找到了!
  3. android6.0 sd卡卸载api,android6.0 用户关掉sd卡读取权限的情况下, 还能做到手机缓存么?...
  4. kudu参数优化设置,让集群飞起来~
  5. 最优视频监控软件开发的实现方法
  6. SQL 必知必会·笔记20高级SQL特性
  7. Mysql数据表的操作
  8. Wordpress在主题中自定义登陆页面并且禁用自带的登陆页面
  9. C# 从服务器下载文件
  10. Python 练习: 打印0到99小于50或大于70的数字
  11. USB转TTL设备驱动不能使用
  12. 【基础】创建react脚手架
  13. vue的npm run dev做了什么
  14. HTML的路径和链接、注释、特殊字符
  15. 【day13】【洛谷算法题】-P5713洛谷团队系统-刷题反思集[入门2分支结构]
  16. C++如何检查浮点数是否为整数
  17. 有空必须要看的文章(没空也要看)
  18. zynq usb dwc3中断事件异常
  19. 以太坊区块链快速入门
  20. Python str(float) 科学计数法

热门文章

  1. 【C语言】a数组中有8个元素,第6个元素后第3个元素移到开头
  2. 株洲科能冲刺上市:计划募资约6亿元,实控人为赵科峰、唐燕夫妇
  3. java地铁最短距离_动手构建地铁关系网,实现最短路径查询
  4. 从业DBA以来的那些事儿
  5. 堡垒机-teleport的安装以及常见问题解决办法
  6. 【观察】维谛技术(Vertiv):以时间价值五力模型践行长期主义,共赴数据中心节碳新征程...
  7. M1卡数据说明以及上位机
  8. IBM Lotus Symphony Linux版安装教程cdlinux教程
  9. 考研与不考研,你的人生或有不同?
  10. STM32 SPI 模拟实现 W25X16读写 代码