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;
}
}