Sqlite在Mybatis Plus中关于时间字段的处理-针对sqlite将时间格式yyyy-MM-dd HH:mm:ss字段数据转为java.util.Date

Sqlite会默认把时间字段转成时间戳存储到数据库的字段中,看起来不直观,所以我采用的是字符串的方式来存储时间字段。
表对象定义
对象中有 create_time,update_time ,expire 三个时间相关的字段。
对象定义:
在这里插入图片描述

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

解决方式
jdbc:sqlite:D:\git\tiger_project\sb3\sb3.db?date_string_format=yyyy-MM-dd HH:mm:ss

spring
	datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: org.sqlite.JDBC
    url: jdbc:sqlite:D:\git\tiger_project\sb3\sb3.db?date_string_format=yyyy-MM-dd HH:mm:ss

方式二: 定义LocalDateTimeTypeHandler , 在对象的时间字段上添加注解

@TableField(typeHandler = LocalDateTimeTypeHandler::class)
注意: 可以解决问题,但是需要在每个时间字段都加注解,比较繁琐,不推荐-切库麻烦

在这里插入图片描述

/**
 *
 * @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类没有问题, 但是SQLiteDateTypeHandler这个类,在Mybatis的原生包中已经存在了, 使用 mybatis-plus.type-handlers-package 这个配置来注册全局TypeHandler不会覆盖Mybatis的原生包中的TypeHandler。

  • 注意是-配置SQLiteDateTypeHandler类所在包名
  • 配置yml
#===========================mybatisPlus配置配置================================
#
mybatis-plus:
  #自定义查询结果字段处理类,针对sqlite将时间格式yyyy-MM-dd HH:mm:ss字段数据转为java.util.Date
  type-handlers-package: com.zz.tiger.config.mybatisplus #`注意`是-配置SQLiteDateTypeHandler类所在包名
  # mapper映射地址
  mapper-locations: classpath:mapper/*.xml
  # 实体类扫描包路径
#  type-aliases-package: com.zz.tiger
  configuration:
    # sql打印
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 开启驼峰命名
    map-underscore-to-camel-case: true

#===========================mybatisPlus配置配置================================
  • SQLiteDateTypeHandler类
package com.zz.tiger.config.mybatisplus;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;

import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@MappedTypes(Date.class)
public class SQLiteDateTypeHandler extends BaseTypeHandler<Date> {

    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, dateFormat.format(parameter));
    }

    @Override
    public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String dateStr = rs.getString(columnName);
        return parseDate(dateStr);
    }

    @Override
    public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String dateStr = rs.getString(columnIndex);
        return parseDate(dateStr);
    }

    @Override
    public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String dateStr = cs.getString(columnIndex);
        return parseDate(dateStr);
    }

    private Date parseDate(String dateStr) {
        if (dateStr != null && !dateStr.trim().isEmpty()) {
            try {
                return dateFormat.parse(dateStr.trim());
            } catch (ParseException e) {
                throw new RuntimeException("Error parsing date: " + dateStr, e);
            }
        }
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值