MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘

yizhihongxing

下面是详细的攻略:

问题描述

在进行 MyBatis 版本升级时,发现项目中的 OffsetDateTime 类型的参数无法正常解析,导致调用 SQL 语句失败。

复盘过程

经过分析,我们发现问题出在 MyBatis 版本升级之后,其内部使用的 Jackson 依赖库(用于 JSON 数据的解析和序列化操作)也进行了更新,从 2.9.4 更新到了 2.11.3。其中,2.11.3 版本对于 OffsetDateTime 的解析策略做了一些改变,导致了参数解析异常。

具体来说,2.11.3 版本的解析策略是将参数按照 UTC(协调世界时)解析为一个时间戳,然后再根据时差转换成本地时间。但是,原先的版本则是直接按照本地时间解析参数。

如果我们直接使用 Mybatis 的默认配置,则会发生参数解析异常。要解决该问题,需要进行如下配置:

<!-- mybatis-config.xml 配置中增加如下配置 -->
<typeHandler>
    <jdbcType>OTHER</jdbcType>
    <javaType>java.time.OffsetDateTime</javaType>
    <handler>org.apache.ibatis.type.OffsetDateTimeTypeHandler</handler>
</typeHandler>

示例

我们提供两个示例,第一个示例展示了使用默认配置时的参数解析异常,第二个示例展示了使用了手动配置解析器之后的正常结果。

示例一

在 MyBatis 配置文件中增加如下配置:

<!-- mybatis-config.xml 中增加以下配置 -->
<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

假设我们有以下的表结构:

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `created_at` datetime(6) DEFAULT CURRENT_TIMESTAMP(6),
  `updated_at` datetime(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

然后我们想要使用 Mybatis 进行查询,查询用户创建时间在某一时间之后的数据。

public interface UserMapper {
    List<User> selectByCreatedAtAfter(@Param("createdAt") OffsetDateTime createdAt);
}
<!-- user.xml 中定义的 SQL -->
<select id="selectByCreatedAtAfter" resultType="User">
    SELECT *
    FROM `user`
    WHERE `created_at` > #{createdAt}
</select>
// 测试代码,模拟调用 Mapper 接口
public void testSelectByCreatedAtAfter() {
    OffsetDateTime createdAt = OffsetDateTime.of(LocalDateTime.of(2021, 8, 1, 0, 0, 0), ZoneOffset.UTC);
    List<User> users = userMapper.selectByCreatedAtAfter(createdAt);
    System.out.println(users);
}

运行该测试方法,会发现 Mybatis 解析参数时,无法将 OffsetDateTime 类型的参数正确解析为本地时间,从而查询失败,报错信息如下:

org.springframework.dao.DataIntegrityViolationException: 
### Error querying database.  Cause: java.sql.SQLException: 
### Cannot parse value of "java.time.OffsetDateTime" to java.sql.Timestamp

示例二

在 Mybatis 配置文件中增加以下配置:

<!-- mybatis-config.xml 配置 -->
<typeHandlers>
    <typeHandler javaType="java.time.OffsetDateTime" handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler"/>
</typeHandlers>

然后重新执行上述的测试代码,此时参数解析正常,查询结果也正确输出。

总结

通过以上的分析和解决方案,我们可以得到以下几个结论:

  1. MyBatis 升级版本时,需要注意其所依赖的外部包,比如 Jackson。
  2. 当参数类型为 OffsetDateTime 时,需要针对这个类型单独配置 TypeHandler。
  3. 配置 TypeHandler 时,需要明确设置 jdbcType 和 javaType 两个属性。
  4. TypeHandler 的配置位置有多种,可以在 MyBatis 配置文件中全局配置,也可以针对单个字段或参数进行配置。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySql安装与使用图文教程【推荐】

    MySql安装与使用图文教程【推荐】 MySQL是一个开源的关系型数据库管理系统,它是一种基于客户端/服务器模式工作的数据库系统。在本教程中,我们将学习如何安装并使用MySQL。以下是该过程的详细步骤: 步骤1:下载MySQL 为了使用MySQL,您需要下载它。您可以从官方网站MySQL Downloads下载最新的MySQL版本。选择适合您操作系统的版本进…

    database 2023年5月22日
    00
  • 公司内部网络监控、局域网上网行为监控软件、电脑网络控制软件白皮书

    “公司内部网络监控、局域网上网行为监控软件、电脑网络控制软件白皮书”是一份详细说明文档,旨在帮助用户了解并正确使用这类软件。 以下是完整攻略: 简介 在公司内部,为了确保员工的工作效率和网络安全性,通常需要对员工的网络行为进行监控和控制。其中,公司内部网络监控、局域网上网行为监控软件、电脑网络控制软件是其中的三种常用工具。本白皮书将详细介绍这三种工具的特点、…

    database 2023年5月21日
    00
  • ASP语言实现对SQL SERVER数据库的操作

    ASP是一种常用于Web开发的服务器端脚本语言,它可以通过连接数据库来实现对数据的操作。SQL SERVER是Microsoft公司开发的关系型数据库管理系统(RDBMS),它与ASP可以很好地结合使用。 下面是实现ASP语言对SQL SERVER数据库的操作的完整攻略: 1. 安装SQL SERVER驱动程序 在ASP程序中操作SQL SERVER数据库,…

    database 2023年5月21日
    00
  • PostgreSQL使用MySQL作为外部表(mysql_fdw)

    PostgreSQL是一个开源的关系型数据库管理系统,是业界感觉较高的一款数据库,而MySQL也是个非常流行的数据库。假如我们需要在PostgreSQL中操作MySQL的表,那么可以使用mysql_fdw这个扩展模块。 mysql_fdw是PostgreSQL的外部数据连接插件,通过创建外部表与MySQL的表进行关联,就能够实现在PostgreSQL中操作M…

    database 2023年5月22日
    00
  • 关于MySQL的存储函数(自定义函数)的定义和使用方法详解

    关于MySQL的存储函数(自定义函数)的定义和使用方法详解 MySQL提供了自定义函数的支持,可以根据业务需求定义自己的函数,方便使用和提高效率。本文将详细讲解MySQL存储函数的定义和使用方法。 存储函数定义 MySQL存储函数是一段SQL代码片段,在使用前需要先定义。 以下是定义一个简单的函数的语法: DELIMITER $$ CREATE FUNCTI…

    database 2023年5月22日
    00
  • 关于 MySQL 嵌套子查询中,无法关联主表字段问题的折中解决方法

    今天在工作中写项目的时候,遇到了一个让我感到几乎无解的问题,在转换了思路后,想出了一个折中的解决方案,记录如下。 其实,问题的场景,非常简单: 就是需要查询出上图的数据,红框是从 项目产品表 中查询的2个字段,绿框是从与项目产品表关联的 文章表 中查询出的1个字段。我希望实现的效果是,获取到项目产品对应的文章提交人数,即该项目产品,有多少人提交了文章。看似很…

    MySQL 2023年4月12日
    00
  • Sql Server 压缩数据库日志文件的方法

    为了压缩Sql Server数据库的日志文件,我们可以采用以下步骤: 1. 确定数据库日志文件的当前大小和剩余空间并检查一下是否允许对它进行转储 可以使用以下查询来确定具体情况: USE [your_database_name] GO DBCC SQLPERF(LOGSPACE) GO 其中的 [your_database_name] 需要替换为你的数据库名…

    database 2023年5月21日
    00
  • Linux下ZendOptimizer的安装与配置方法

    下面是关于在Linux系统下安装和配置ZendOptimizer的攻略: 1. 下载和安装ZendOptimizer 首先,需要到Zend官网上下载对应版本的ZendOptimizer安装包,网址为:https://www.zend.com/en/products/zend-guard/downloads 下载完毕后,可以通过命令行或者图形化界面的方式解压安…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部