MyBatis插入记录时间与保存到数据库时间不一致(从数据库读取出的时间类型的字段与数据库中的不一致)

本文分享了一次解决MySQL数据库时区导致的时间偏差问题的经历。通过查询数据库时区并理解CST时区的多重含义,最终通过调整JDBC连接URL中的时区参数解决了问题。

昨天写代码时遇见的问题,自己解决了好久,一直以为是自己代码写的有问题?最后同事和我讲可能是mysql数据库的时区问题。

1.先网上查了一下获取mysql数据库时区的方法

SELECT CURTIME();#查看mysql当前时间

或者SELECT NOW();#查看mysql当前时间

SHOW VARIABLES LIKE "%time_zone%"#time_zone说明mysql使用system的时区,system_time_zone说明system使用CST时区

百度了一下CST 时区获得以下信息

GMT(Greenwich Mean Time)代表格林尼治标准时间。  

而CST却同时可以代表如下 4 个不同的时区:  

1.Central Standard Time (USA) UT-6:00

2.Central Standard Time (Australia) UT+9:30

3.China Standard Time UT+8:00

4.Cuba Standard Time UT-4:00            

可见,CST可以同时表示美国,澳大利亚,中国,古巴四个国家的标准时间

看看了百度讲的其实也不是特别理解,大致就是知道CST时区会导致时间有偏差。

解决方式(解决方式有很多中,我认为这个是好理解的和最简单的一种方式)

设置jdbcUrl加入serverTimezone=Asia/Shanghai

<think>嗯,用户的问题是关于如何通过MyBatis-Plus将feature.getDefaultGeometry()获取的几何对象保存到PostgreSQL数据库。首先,我需要明确几个关键:用户使用的技术栈是MyBatis-Plus和PostgreSQL,而几何对象可能来自某个地理信息系统(GIS)库,比如GeoTools的Feature接口。 首先,PostgreSQL处理空间数据通常使用PostGIS扩展,所以需要确认数据库是否已经安装了PostGIS。如果没有安装,用户需要先安装并启用它,这样才能存储空间数据类型,比如Geometry。 接下来,用户需要在实体类中映射几何字段MyBatis-Plus默认可能支持PostGIS的几何类型,所以需要考虑如何将Java中的几何对象转换为PostgreSQL能够识别的类型。通常,这可以通过自定义类型处理器来实现。比如,使用JTS库的Geometry对象,然后编写一个TypeHandler来处理GeometryPGobject之间的转换。 然后,数据库表的结构需要正确设计,对应的几何字段应该是geometry类型。例如,创建一个表,其中包含一个名为geom的字段,类型为geometry,并指定坐标系,如GEOMETRY(Point, 4326)。 在实体类中,用户需要使用@TableName注解指定表名,并在几何字段上使用@TableField注解,指定自定义的TypeHandler。这样,当MyBatis-Plus进行数据插入或查询时,会自动调用这个处理器来转换数据类型。 此外,可能需要添加依赖,比如PostgreSQL的JDBC驱动、MyBatis-Plus的核心库以及JTS库,确保这些依赖在项目中正确配置。 用户可能遇到的问题包括依赖缺失、类型转换错误或者PostGIS未正确安装。需要提醒用户检查这些方面,并确保所有配置正确无误。 最后,给一个示例代码,展示实体类和TypeHandler的实现,以及如何调用MyBatis-Plus的保存方法。这样用户可以直接参考代码进行实现,同时提供相关问题和注意事项,帮助用户进一步理解和解决可能遇到的问题。</think>### 通过 MyBatis-Plus 保存几何对象到 PostgreSQL 的步骤 #### 1. 配置 PostgreSQL 空间扩展 - 确保 PostgreSQL 已安装 PostGIS 扩展 ```sql CREATE EXTENSION IF NOT EXISTS postgis; ``` #### 2. 定义数据库表结构 ```sql CREATE TABLE spatial_data ( id SERIAL PRIMARY KEY, geom GEOMETRY(Geometry,4326) -- 根据实际坐标系调整 ); ``` #### 3. 添加依赖(pom.xml) ```xml <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.6.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>org.locationtech.jts</groupId> <artifactId>jts-core</artifactId> <version>1.19.0</version> </dependency> ``` #### 4. 实体类映射 ```java @Data @TableName("spatial_data") public class SpatialData { private Long id; @TableField(typeHandler = GeometryTypeHandler.class) private Geometry geom; } ``` #### 5. 自定义类型处理器 ```java public class GeometryTypeHandler extends BaseTypeHandler<Geometry> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Geometry parameter, JdbcType jdbcType) throws SQLException { PGgeometry pgGeometry = new PGgeometry(parameter.toText()); ps.setObject(i, pgGeometry); } // 实现其他抽象方法(结果集转换) } ``` #### 6. 使用保存操作 ```java Feature feature = ... // 获取feature对象 Geometry geometry = feature.getDefaultGeometry(); SpatialData data = new SpatialData(); data.setGeom(geometry); spatialDataMapper.insert(data); ``` ### 注意事项 1. 坐标系需要数据库字段定义一致(如 4326 vs 3857) 2. 确保 MyBatis-Plus 配置扫描到自定义类型处理器 3. 复杂几何类型需要验证有效性(使用 `geometry.isValid()`)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值