GeometryCollection 的类型映射器(TypeHandler)

news/2024/10/4 4:16:14

by emanjusaka from https://www.emanjusaka.top/2024/05/mybatis-typeHandler-geometryCollection 彼岸花开可奈何
本文欢迎分享与聚合,全文转载请留下原文地址。

GeometryCollection 是 GeoJSON 数据模型中的一个类型,用于表示一个几何对象的集合。MySQL8 中支持了 GeometryCollection 类型,在对数据库和实体类进行对象映射时需要我们自己编写类型映射器来完成映射。java 本身不支持 GeometryCollection 类型,我们需要引入第三方包来获得支持。

引入geotools工具包

该依赖在 maven 中央仓库中没有,需要另外配置下仓库

geotools库支持 jdk8 的最高版本是 28.2。

 <dependency><groupId>org.geotools</groupId><artifactId>gt-geojson-core</artifactId><version>28.2</version></dependency><repositories><!-- geotools的远程库 --><repository><id>osgeo</id><name>OSGeo Release Repository</name><url>https://repo.osgeo.org/repository/release/</url><snapshots><enabled>false</enabled></snapshots><releases><enabled>true</enabled></releases></repository><repository><id>osgeo-snapshot</id><name>OSGeo Snapshot Repository</name><url>https://repo.osgeo.org/repository/snapshot/</url><snapshots><enabled>true</enabled></snapshots><releases><enabled>false</enabled></releases></repository><!-- geotools的远程库end --></repositories>

实体类

本示例的 mybatis 增加框架使用的是 tkmapper,如果是使用的 MyBatisPlus 注解切换成对应的注解,大同小异。为了演示方便我去除了无关字段,重点关注 GeometryCollection 类型的 areaGeom 字段即可。

package top.emanjusaka.test;import com.iles.handler.GeometryCollectionTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.locationtech.jts.geom.GeometryCollection;
import tk.mybatis.mapper.annotation.ColumnType;import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;@Data
@EqualsAndHashCode(callSuper = false)
@Table(name = "car_work_area")
public class CarWorkAreaDO {private static final long serialVersionUID = 1L;/*** 自增 ID*/@Id@GeneratedValue(generator = "JDBC")private Long id;@Column(name = "area_geom")@ColumnType(typeHandler = GeometryCollectionTypeHandler.class)private GeometryCollection areaGeom;}

TypeHandler 映射器

大多数支持地理空间数据的数据库系统(如 PostgreSQL/PostGIS、MySQL、SQL Server 等)都支持以 WKT 或 WKB 格式存储和检索 GeometryCollection 类型的数据。具体使用哪种格式取决于应用场景的需求,比如对存储空间的敏感度、数据交换的便捷性以及性能要求等。本文存储的是 WKT 格式。

package top.emanjusaka.handler;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.locationtech.jts.geom.GeometryCollection;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.WKTWriter;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @Author emanjusaka*/
public class GeometryCollectionTypeHandler extends BaseTypeHandler<GeometryCollection> {private static final WKTReader wktReader = new WKTReader();@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, GeometryCollection parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter.toText());}@Overridepublic GeometryCollection getNullableResult(ResultSet rs, String columnName) throws SQLException {String wkt = rs.getString(columnName);try {return wkt != null ? (GeometryCollection) wktReader.read(wkt) : null;} catch (ParseException e) {throw new RuntimeException(e);}}@Overridepublic GeometryCollection getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String wkt = rs.getString(columnIndex);try {return wkt != null ? (GeometryCollection) wktReader.read(wkt) : null;} catch (ParseException e) {throw new RuntimeException(e);}}@Overridepublic GeometryCollection getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String wkt = cs.getString(columnIndex);try {return wkt != null ? (GeometryCollection) wktReader.read(wkt) : null;} catch (ParseException e) {throw new RuntimeException(e);}}
}

mapper 文件

package top.emanjusaka.mapper;import top.emanjusaka.test.CarWorkAreaDO;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.Mapper;import java.util.List;public interface CarWorkAreaMapper extends Mapper<CarWorkAreaDO> {/*** 插入数据** @param carWorkArea* @return:*/int insertCustom(CarWorkAreaDO carWorkArea);
}

注意事项:

  • resultMap 中 area_geom 字段注意配置 TypeHandler,否则无法进行映射导致报错
  • 插入的 sql 语句中,area_geom 字段也需要指定 typeHandler,并且需要调用 ST_GeomCollFrom()函数读取数据。
  • 查询时可以调用函数 AsTex()
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="top.emanjusaka.mapper.CarWorkAreaMapper"><resultMap type="com.iles.models.car.CarWorkAreaDO" id="carWorkAreaResult"><result property="id" column="id"/><result property="areaGeom" column="area_geom" javaType="org.locationtech.jts.geom.GeometryCollection"jdbcType="OTHER"typeHandler="top.emanjusaka.handler.GeometryCollectionTypeHandler"/></resultMap><insert id="insertCustom" parameterType="com.iles.models.car.CarWorkAreaDO">insert intocar_work_area(id,area_geom)values(#{id},ST_GeomCollFromText(#{areaGeom,typeHandler=top.emanjusaka.handler.GeometryCollectionTypeHandler}))</insert>
</mapper>

在技术的星河中遨游,我们互为引路星辰,共同追逐成长的光芒。愿本文的洞见能触动您的思绪,若有所共鸣,请以点赞之手,轻抚赞同的弦。
原文地址: https://www.emanjusaka.top/2024/05/mybatis-typeHandler-geometryCollection
微信公众号:emanjusaka的编程栈

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

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

相关文章

把.nuget文件夹从C盘移到其它盘

C盘是系统盘,考虑到很多程序都会占用系统盘资源,所以500G的固态硬盘究竟,一开始C盘就划了300G的大小。但即便这样,不知不觉中,C盘的空间也快不够用了。 分析了一下C盘的空间占用情况,发现.nuget文件夹大概有40多G的大小。这个不能忍,直接上网搜了一下移到其它盘的方法。…

磁盘恢复,照片误删 解决策略-photorec

# 下载软件TestDisk Download - CGSecurity # 解压文件夹 testdisk-7.2 # 打开qphotorec_win 界面如下 # 筛选要恢复的文件格式 ## 恢复图片就选中jpg,png,jpeg 先点击一个词条,键盘按j,就可以定位到j开头的格式位置

Docker+Jenkins自动化测试实践

前期介绍:基于Python+unittest的接口自动化测试框架,打算使用Docker容器技术+jenkins持续集成的能力实现接口自动化测试的持续集成 前提:了解jenkins的使用Docker简介 概念虚拟化:一种资源管理技术(虚拟机、内存管理、硬盘分区管理) Docker是什么:虚拟化技术的一种,虚拟…

javaScript之局部变量,全局变量与局部作用域,全局作用域

前端开发工作者,最需要学习的一门语言就是JavaScript了吧,其实学习大部分编程语言都是从基本的语法知识开始人门的。什么语句、变量、数据类型、对象、函数...今天本文就简单说明javaScript变量中的一个小小的知识点,其实在后面的最开始工作编程中我也是常常容易出现bug的一…

git拉取VUE并初次启动运行

一、通过从git项目中拉取项目后初次并启动运行 1、在vscode从git获取拉取项目 2、拉取项目后启动运行 (需要先安装npm --- npm install) 安装报错 解决: 1、复制这个路径,打开文件夹 (找到npm的安装路径,查看是否有node.exe的启动文件。)打开后会发现没有 2、找到nod…

docker搭建redis集群(三主三从)及重启redis集群 redis扩容新增集群

docker搭建redis集群(三主三从)及重启redis集群 一、docker搭建redis集群1、下载redis镜像文件从远程仓库先拉取一下redis的镜像文件,如果已经提前安装过镜像的,可以跳过此步骤: docker pull redis:6.0.82、查看本地拉取到镜像文件docker images 看到图上标识,就说明当前…

Go pprof 认知到实践

快速开始 测试环境:go version go1.22.2 windows/amd64,源代码开源在 https://github.com/oldme-git/teach-study/tree/master/golang/base/pprof 在正式开始之前,请确保安装 graphviz,这一步不可省略,它可以协助 pprof 生成更直观的数据分析图。可以参考官方网站的安装方…

C#与PLC变量在数据交互上的一些探索

1. 基于C#的数据交互 A. S7,using S7.Net,后文读写数据时二次封装过S7协议,这里暂且不表,只列举S7协议最原始的应用。new一个PLC对象//idenfy basic link paramsprivate string plc_ip;private CpuType plc_type;private short plc_rack, plc_slot;public Plc my_plc;my_plc…