Mybatis配置-类型处理器(typeHandlers)

2023-12-18 16:12

本文主要是介绍Mybatis配置-类型处理器(typeHandlers),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每当MyBatis设置PreparedStatement的参数或从ResultSet中检索值时,都会使用TypeHandler以适合Java类型的方式来检索值。下表描述了默认的TypeHandlers。

自MyBatis 3.4.5版本起,默认支持JSR-310(日期和时间API)。

Type HandlerJava TypesJDBC Types
BooleanTypeHandlerjava.lang.BooleanbooleanAny compatible BOOLEAN
ByteTypeHandlerjava.lang.BytebyteAny compatible NUMERIC or BYTE
ShortTypeHandlerjava.lang.ShortshortAny compatible NUMERIC or SMALLINT
IntegerTypeHandlerjava.lang.IntegerintAny compatible NUMERIC or INTEGER
LongTypeHandlerjava.lang.LonglongAny compatible NUMERIC or BIGINT
FloatTypeHandlerjava.lang.FloatfloatAny compatible NUMERIC or FLOAT
DoubleTypeHandlerjava.lang.DoubledoubleAny compatible NUMERIC or DOUBLE
BigDecimalTypeHandlerjava.math.BigDecimalAny compatible NUMERIC or DECIMAL
StringTypeHandlerjava.lang.StringCHARVARCHAR
ClobReaderTypeHandlerjava.io.Reader-
ClobTypeHandlerjava.lang.StringCLOBLONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHARNCHAR
NClobTypeHandlerjava.lang.StringNCLOB
BlobInputStreamTypeHandlerjava.io.InputStream-
ByteArrayTypeHandlerbyte[]Any compatible byte stream type
BlobTypeHandlerbyte[]BLOBLONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER, or unspecified
EnumTypeHandlerEnumeration TypeVARCHAR any string compatible type, as the code is stored (not index).
EnumOrdinalTypeHandlerEnumeration TypeAny compatible NUMERIC or DOUBLE, as the position is stored (not the code itself).
SqlxmlTypeHandlerjava.lang.StringSQLXML
InstantTypeHandlerjava.time.InstantTIMESTAMP
LocalDateTimeTypeHandlerjava.time.LocalDateTimeTIMESTAMP
LocalDateTypeHandlerjava.time.LocalDateDATE
LocalTimeTypeHandlerjava.time.LocalTimeTIME
OffsetDateTimeTypeHandlerjava.time.OffsetDateTimeTIMESTAMP
OffsetTimeTypeHandlerjava.time.OffsetTimeTIME
ZonedDateTimeTypeHandlerjava.time.ZonedDateTimeTIMESTAMP
YearTypeHandlerjava.time.YearINTEGER
MonthTypeHandlerjava.time.MonthINTEGER
YearMonthTypeHandlerjava.time.YearMonthVARCHAR or LONGVARCHAR
JapaneseDateTypeHandlerjava.time.chrono.JapaneseDateDATE

 您可以覆盖或创建自己的TypeHandler来处理不受支持或非标准的类型。为此,您需要实现org.apache.ibatis.type.TypeHandler接口或扩展org.apache.ibatis.type.BaseTypeHandler类,并可选择将其映射到JDBC类型。以下是一个示例:

// ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i,String parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter);}@Overridepublic String getNullableResult(ResultSet rs, String columnName)throws SQLException {return rs.getString(columnName);}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex)throws SQLException {return rs.getString(columnIndex);}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex)throws SQLException {return cs.getString(columnIndex);}
}
<!-- mybatis-config.xml -->
<typeHandlers><typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

使用这样的TypeHandler会覆盖Java String属性和VARCHAR参数和结果的现有TypeHandler。请注意,MyBatis不会根据数据库元数据进行内省来确定类型,因此必须在参数和结果映射中指定它是一个VARCHAR字段,以便连接正确的TypeHandler。这是因为直到执行语句时,MyBatis才能意识到数据类型。

MyBatis会通过TypeHandler的泛型类型来确定您想要处理的Java类型,但是您可以通过以下两种方式来覆盖这种行为:

  1. 给typeHandler元素添加javaType属性,例如:javaType="String"。这将明确指定TypeHandler所要关联的Java类型。

  2. 在TypeHandler类上添加@MappedTypes注解,指定要关联的Java类型列表。如果同时指定了javaType属性,@MappedTypes注解将被忽略。

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

  1. 给typeHandler元素添加jdbcType属性,例如:jdbcType="VARCHAR"。这将明确指定与TypeHandler关联的JDBC类型。

  2. 在TypeHandler类上添加@MappedJdbcTypes注解,指定要关联的JDBC类型列表。如果同时指定了jdbcType属性,@MappedJdbcTypes注解将被忽略。

 在决定在ResultMap中使用哪个TypeHandler时,已知Java类型(来自结果类型),但未知JDBC类型。因此,MyBatis将使用组合javaType=[Java类型],jdbcType=null来选择一个TypeHandler。这意味着使用@MappedJdbcTypes注解会限制TypeHandler的范围,并且除非明确设置,否则它将无法在ResultMap中使用。为了使一个TypeHandler可以在ResultMap中使用,可以在@MappedJdbcTypes注解上设置includeNullJdbcType=true。然而,自从Mybatis 3.4.0版本开始,如果一个单独的TypeHandler被注册用于处理一个Java类型,默认情况下它将被用于使用该Java类型的ResultMaps(即使没有includeNullJdbcType=true)。

最后,您可以让MyBatis为您的TypeHandler进行搜索:

<!-- mybatis-config.xml -->
<typeHandlers><package name="org.mybatis.example"/>
</typeHandlers>

 请注意,当使用自动发现功能时,只能使用注解来指定JDBC类型。

您可以创建一个通用的TypeHandler,它能够处理多个类。为此,您可以添加一个构造函数,接收一个Class作为参数,MyBatis在构造TypeHandler时将传递实际的类。

//GenericTypeHandler.java
public class GenericTypeHandler<E extends MyObject> extends BaseTypeHandler<E> {private Class<E> type;public GenericTypeHandler(Class<E> type) {if (type == null) throw new IllegalArgumentException("Type argument cannot be null");this.type = type;}...

 EnumTypeHandler和EnumOrdinalTypeHandler是通用的TypeHandler。

这篇关于Mybatis配置-类型处理器(typeHandlers)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/509031

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe