Sqlite在Mybatis Plus中关于时间字段的处理

news2024/12/23 12:10:33

我的个人项目中,使用Mybatis-Plus 和 Sqlite数据库, 但是在存储和查询时间字段的时候,总是出现问题,记录下我解决问题的过程。

Sqlite会默认把时间字段转成时间戳存储到数据库的字段中,看起来不直观,所以我采用的是字符串的方式来存储时间字段。

表对象定义

对象中有 create_timeupdate_timeexpire 三个时间相关的字段。

对象定义:
在这里插入图片描述

项目启动的初始化脚本报错

数据库

insert into main.u_invite (id, sender, email, code, expire, status, create_time, update_time) 
values (1, 1, 'v.ccgux@yhtj.no', 'L9RD37', '2024-05-18 17:38:50', 2, '2024-05-11 17:38:32', '2024-05-11 17:46:26');

启动报错如下

Caused by: java.sql.SQLException: Error parsing time stamp
	at org.sqlite.jdbc3.JDBC3ResultSet.getTimestamp(JDBC3ResultSet.java:532)
	at org.sqlite.jdbc3.JDBC3ResultSet.getTimestamp(JDBC3ResultSet.java:585)
	at com.zaxxer.hikari.pool.HikariProxyResultSet.getTimestamp(HikariProxyResultSet.java)
	at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:38)
	at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:28)
	at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:85)
	...... 154 more
Caused by: java.text.ParseException: Unparseable date: "2024-02-24 00:00:00" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
	at org.sqlite.date.FastDateParser.parse(FastDateParser.java:299)
	at org.sqlite.date.FastDateFormat.parse(FastDateFormat.java:490)
	at org.sqlite.jdbc3.JDBC3ResultSet.getTimestamp(JDBC3ResultSet.java:529)
	... 79 more

从报错信息可以看出是时间字段存入数据库的时候,无法识别格式报错。

解决方式

方式一: 在jdbcurl后面追加 date_string_format 参数, 不推荐, 有其他问题。

在这里插入图片描述
注意: 虽然可以顺利解决插入sql中字符串时间的插入问题,但是有两个问题:

  • 此方法只解决了插入sql中时间字段的识别问题,查询的时候还是无法识别和解析
  • 使用Mybatis Plus的save方法保存到数据库中的时间字段还是时间戳

方式二: 定义LocalDateTimeTypeHandler , 在对象的时间字段上添加注解 @TableField(typeHandler = LocalDateTimeTypeHandler::class)

注意: 可以解决问题,但是需要在每个时间字段都加注解,比较繁琐, 不推荐。

对象中加上注解如下:
在这里插入图片描述

增加的LocalDateTimeTypeHandler 类如下:

/**
 *
 * @author xiezc
 * @date 2024/5/11 15:51
 */
@MappedTypes(LocalDateTime::class)
@MappedJdbcTypes(JdbcType.VARCHAR)
class LocalDateTimeTypeHandler : BaseTypeHandler<LocalDateTime>() {

    override fun setNonNullParameter(ps: PreparedStatement, i: Int, parameter: LocalDateTime, jdbcType: JdbcType?) {
        val value = parameter.format(LocalDateTimeFormatter)
        ps.setString(i, value)
    }

    override fun getNullableResult(rs: ResultSet, columnName: String): LocalDateTime? {
        val timestamp = rs.getString(columnName)
        return getLocalDateTime(timestamp)
    }

    override fun getNullableResult(rs: ResultSet, columnIndex: Int): LocalDateTime? {
        val timestamp = rs.getString(columnIndex)
        return getLocalDateTime(timestamp)
    }

    override fun getNullableResult(cs: CallableStatement, columnIndex: Int): LocalDateTime? {
        val timestamp = cs.getString(columnIndex)
        return getLocalDateTime(timestamp)
    }

    private fun getLocalDateTime(timestamp: String?): LocalDateTime? {
        if (timestamp != null) {
            return LocalDateTime.parse(timestamp, LocalDateTimeFormatter)
        }
        return null
    }
}

方式三: 注册全局的TypeHandler类。

注册全局TypeHandler类没有问题, 但是LocalDateTimeTypeHandler 这个类,在Mybatis的原生包中已经存在了, 使用 mybatis-plus.type-handlers-package 这个配置来注册全局TypeHandler不会覆盖Mybatis的原生包中的TypeHandler

下面截图中的方式只能注册 Mybatis中没有的TypeHandler
在这里插入图片描述

但是有其他的办法,就是创建同名类来覆盖引入包中的类

  • 通过查找发现Mybatis中的LocalDateTimeTypeHandler存在org.apache.ibatis.type包下面, 我可以在自己项目中创建个同名包,并在包下创建同名类,覆盖它,问题完美解决。

在这里插入图片描述

总结

Sqlite数据库有自己单独的字段类型处理方式, Mybatis对其支持并不完善, 从发现问题到解决问题我中间尝试了各种方法, 最终还是通过覆盖Mybatis的类来解决问题了。

Sqlite对于时间自动转换成时间戳的方式也不太好,我改成了字符串的方式,查看和显示比较直观。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1666068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑微电网联盟协调运行的用户侧共享储能多计费方式博弈定价方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

YOLOv8训练流程-原理解析[目标检测理论篇]

关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了&#xff0c;为了更好地学习本章内容&#xff0c;建议先去看预测流程的原理分析YOLOv8原理解析[目标检测理论篇]-CSDN博客&#xff0c;再次把YOLOv8网络结构图放在这里&#xff0c;方便随时查看。 ​ 1.前言 YOLOv8训练…

geoserver SQL注入、Think PHP5 SQL注入、spring命令注入

文章目录 一、geoserver SQL注入CVE-2023-25157二、Think PHP5 SQL注入三、Spring Cloud Function SpEL表达式命令注入&#xff08;CVE-2022-22963&#xff09; 一、geoserver SQL注入CVE-2023-25157 介绍&#xff1a;GeoServer是一个开源的地理信息系统&#xff08;GIS&#…

[C/C++] -- 大数的加减法

大数加减法的问题主要产生于计算机基本数据类型的表示范围限制。通常情况下&#xff0c;计算机采用有限位数的数据类型&#xff08;如int、long&#xff09;来表示整数&#xff0c;这些数据类型的表示范围有限&#xff0c;无法表示超出范围的大整数。 例如超过了long类型的表示…

支持播放h265的插件

插件源码地址&#xff1a;GitCode - 开发者的代码家园https://gitcode.com/mirrors/nanguantong/flv-h265.js/overview 1. 下载代码 运行以下命令 npm i npm run build npm run build 后生成 flv.min.js 文件&#xff0c;引入使用 2. 调用 js 文件&#xff1a; let flvj…

【数据结构】链式栈

链式栈 一、链式栈的栈顶在哪里&#xff1f; 二、链式栈的结构&#xff1a; typedef struct LSNode {int data;struct LSNode* next; }LSNode, *PLStack; // 链栈的节点&#xff0c;由于栈顶在第一个数据节点&#xff0c;所以不需要top指针三、链式栈的实现 //初始化 void …

价格中间加横杠

<span></span>59 <span class"price">177</span>.price{ text-decoration:line-through; }

vue2和vue3区别: 探索关键差异

vue2和vue3区别&#xff1a; 探索关键差异 Vue.js 作为流行的前端框架&#xff0c;其版本 3 带来了许多令人兴奋的改进和新功能。虽然 Vue 3 保持了与 Vue 2 的相似性&#xff0c;但也存在一些关键差异需要开发者注意。本文将通过表格形式&#xff0c;清晰地展现 Vue 2 和 Vue …

清理缓存简单功能实现

在程序开发中&#xff0c;经常会用到缓存&#xff0c;最常用的后端缓存技术有Redis、MongoDB、Memcache等。 而有时候我们希望能够手动清理缓存&#xff0c;点一下按钮就把当前Redis的缓存和前端缓存都清空。 功能非常简单&#xff0c;创建一个控制器类CacheController&#xf…

Android Studio连接MySQL8.0

【序言】 移动平台这个课程要做一个app的课设&#xff0c;我打算后期增加功能改成毕设&#xff0c;就想要使用MySQL来作为数据库&#xff0c;相对于SQLlite来说&#xff0c;我更熟悉MySQL一点。 【遇到的问题】 一直无法连接上数据库&#xff0c;开始的时候查了很多资料&#…

Jmeter中线程组介绍

1.线程数的意义 Jmeter采用了线程来模拟用户&#xff0c;即1个线程代表1个用户&#xff0c;线程可以简单理解为计算机处理任务时的一个具体执行人。 一个任务可以由多个人&#xff08;线程&#xff09;共同完成&#xff0c;也可以由一个人&#xff08;线程&#xff09;来完成&a…

基于LLM的自行车道CAD

LLM&#xff08;大型语言模型&#xff09;是强大的工具。对于许多人来说&#xff0c;用语言表达愿望通常比浏览复杂的 GUI 更简单。 1、系统简介和环境搭建 urb-x.ch&#xff0c;这是一家专门从事自行车道建设的公司。轨道采用模块化构建块进行独特设计&#xff0c;可以通过多…

AI工具的热门与卓越:揭示AI技术的实际应用和影响

文章目录 每日一句正能量前言常用AI工具创新AI应用个人体验分享后记 每日一句正能量 我们在我们的劳动过程中学习思考&#xff0c;劳动的结果&#xff0c;我们认识了世界的奥妙&#xff0c;于是我们就真正来改变生活了。 前言 随着人工智能&#xff08;AI&#xff09;技术的快…

prometheus、mysqld_exporter、node_export、Grafana安装配置

工具简介 Prometheus&#xff08;普罗米修斯&#xff09;&#xff1a;是一个开源的服务监控系统和时间序列数据库 mysqld_exporter&#xff1a; 用于监控 mysql 服务器的开源工具&#xff0c;它是由 Prometheus 社区维护的一个官方 Exporter。该工具通过连接到mysql 服务器并执…

每日一题9:Pandas-填充缺失值

一、每日一题 DataFrame products --------------------- | Column Name | Type | --------------------- | name | object | | quantity | int | | price | int | ---------------------编写一个解决方案&#xff0c;在 quantity 列中将缺失的值 编…

flutter开发实战-人脸识别相机使用

flutter开发实战-人脸识别相机使用 当需要拍摄的时候&#xff0c;需要检测到人脸再进行后续的操作&#xff0c;这里使用的是face_camera 一、引入face_camera 在工程的pubspec.yaml中引入插件 # 检测人脸face_camera: ^0.0.8iOS端需要设置相关权限 在info.plist文件中&…

编程代码的舞者--Python循环语句

循环语句是编程中不可或缺的要素之一&#xff0c;它们能够让程序反复执行特定的任务&#xff0c;提高代码的重复利用性和效率。在本篇博客中&#xff0c;我们将深入探讨Python中常用的循环语句&#xff0c;包括for循环和while循环&#xff0c;以及控制循环流程的关键字break和c…

【Win10设备管理器中无端口选项】

计算机疑难杂症分享002 Win10设备管理器中无端口选项1、问题现象2、问题原因3、问题解决3.1、驱动精灵(亲测的此方法)3.2、添加过时硬件3.3、官方的方法 Win10设备管理器中无端口选项 1、问题现象 当我调试串口通信时&#xff0c;发现打开设备管理器没有端口&#xff0c;打开…

系统需求开发和管理指南(软件标准文件Word)

1.需求获取的方式 2.需求分析的准则 3.需求分析的方法 4.需求开发考虑的方面 5.需求确认的方法 6.需求优先级的设定 7.需求文档编制规范要求 软件全文档获取方式一&#xff1a;本文末个人名片直接获取。 软件全文档获取二&#xff1a;软件项目开发全套文档下载_软件项目文档-C…

Unity开发中导弹路径散射的原理与实现

Unity开发中导弹路径散射的原理与实现 前言逻辑原理代码实现导弹自身脚本外部控制脚本 应用效果结语 前言 前面我们学习了导弹的追踪的效果&#xff0c;但是在动画或游戏中&#xff0c;我们经常可以看到导弹发射后的弹道是不规则的&#xff0c;扭扭曲曲的飞行&#xff0c;然后击…