MyBatis 配置 typeHandlers 详解

0x00:前言参考

之前的《MyBatis 中 SqlMapConfig 配置文件详解》记了一下 MyBatis 中的核心配置文件各个标签的作用和使用场景,这篇文章细说一下配置文件中 typeHandlers 标签的详细使用。

0x01:标签介绍

在 MyBatis 的 sql 映射配置文件中,为 sql 配置的输入参数最终要从 java 类型转换成数据库能识别的类型,而从 sql 的查询结果集中获取的数据,也要从数据库的数据类型转换为对应的 Java 类型。

在 MyBatis 中,使用类型处理器(TypeHandler)将数据库获取的值以合适的方式转换为 Java 类型,或者将 Java 类型的参数转换为数据库对应的类型。

在 MyBatis 中有许多自带的类型处理器,但有时候也会满足不了开发的需求,这时候就需要配置自己的类型处理器了,而 typeHandlers 标签就是用来声明自己的类型处理器的。

0x02:编写说明

使用 typeHandlers 标签配置一个自己的类型处理器,一般需要三个步骤:编写类型处理器类,在 MyBatis 全局配置文件中配置该类型处理器,在 sql 映射配置文件中使用。

setParameter 方法是在 sql 配置传入参数时(新增、删除、修改、查询)执行的操作,可以在将参数传入数据库之前在该方法中对数据类型做处理。

另外三个 getResult 方法则在数据库返回结果时,将结果信息转换为相应的 Java 类型。区别在于前两个 getResult 方法供普通 select 方法使用,一个根据字段名,一个根据字段下标来获取数据,最后一个 getResult 方法供存储过程使用,根据字段下标获取数据。

0x03:代码示例

以下代码是编写一个将 JDBC 的 timestamp 类型与 Date 类型相互转换的类型处理器配置示例:

之后在 MyBatis 的全局配置文件 SqlMapConfig 中使用 typeHandlers 标签来注册类型处理器,示例代码如下:

然后在 sql 映射文件 xxxMapper.xml 中的 sql 语句中添加自定义的类型处理器的处理配置即可,代码示例如下:

如果设置了参数 regdate,就会将 Java 的 Date 类型转换为数据库需要的 timestamp 类型。另外,对于查询结果,如果定义了 resultMap 来设置结果集对象的映射,同样可以在标签内指定 javaType,jdbcType 和 typeHandler 的名称。

0x04:知识拓展

BaseTypeHandler 本身已经实现了 TypeHandler 接口,并继承了 TypeReferance 抽象类,在它内部简单的实现了 TypeHandler 接口中定义的四个方法的部分功能。

继承 BaseTypeHandler 类之后,可以通过改写 setNonNullParameter、getNullableResult 方法(三个)来实现类型处理器。示例代码如下:

因为 BaseTypeHandler 继承 TypeReferance 抽象类,所以它本身也是一个抽象类,类中的 4 个方法也为抽象方法。

0x05:总结

MyBatis 中,其内部的类型处理器大部分都是继承上面的 4 个方法来实现的,当其内部的类型处理器无法满足开发需求时,就需要自己定义类型处理类,步骤为先编写类型处理器类,其次将该处理器类配置到全局配置文件中,最后在 sql 映射配置文件中使用即可。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180623G1MCHK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券