KingBaseDB对POINT类型和PATH类型的应用

前言

由于业务需要对坐标信息进行存储,包括中心点和区域坐标数组,然后就开始考虑数据的存储问题,刚开始想着用最简单的两个字段分别存储经度纬度,这样发现关联查询表可能会比较多,有点麻烦。之后想起来kingbase好像有对坐标信息支持的类型,于是查了查文档,试了一下就有了这篇文章,这篇文章主要目的在于如何在实际业务中应用POINT数据类型和PATH数据与java对象的映射转换,完成业务功能。

涉及的工具和库

  • KingBaseES V8R3
  • Mybatis-plus
  • lombok

具体步骤

创建数据库表

-- 位置表信息
create table busi_assets_location
(id varchar(25) not nullconstraint busi_assets_location_pkprimary key,fid VARCHAR(50) NOT NULL,centre POINT,area Decimal(10,2),boundary path,create_time timestamp not null,create_by VARCHAR(25) not null,update_time timestamp,update_by varchar(25)
);comment on TABLE public.busi_assets_location is '资产地理信息表';
comment on column busi_assets_location.id is '主键';
comment on column busi_assets_location.fid is '资产id';
comment on column busi_assets_location.area is '面积';
comment on column busi_assets_location.boundary is '边界坐标';
comment on column busi_assets_location.create_time is '创建时间';
comment on column busi_assets_location.create_by is '创建人';
comment on column busi_assets_location.update_time is '更新时间';
comment on column busi_assets_location.update_by is '更新人';

创建实体类

package com.seerbigdata.assets.domain.po;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.kingbase8.geometric.KBpath;
import com.kingbase8.geometric.KBpoint;
import com.seerbigdata.common.core.domain.BaseEntity;
import com.seerbigdata.common.handler.KBPathTypeHandler;
import com.seerbigdata.common.handler.KBPointTypeHandler;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;@Data
@TableName("busi_assets_location")
public class AssertsLocation extends BaseEntity implements Serializable {private static final long serialVersionUID = 1L;/*** ID*/@TableId(value = "id")@ApiModelProperty(value = "id")private String id;/*** 资产id*/private String fid;/*** 中心点坐标*/@TableField(value = "centre",typeHandler = KBPointTypeHandler.class)private KBpoint centre;/*** 面积*/private BigDecimal area;/*** 边界坐标*/@TableField(value = "boundary",typeHandler = KBPathTypeHandler.class)private KBpath boundary;}

编写类型处理器(重点)

其实最重要的就是根据kingbase提供的jdbc驱动中的地理位置类型编写相应的类型处理器,然后在跟实体类做关联,让后mybatis-plus能找到对应的处理器来对属性进行赋值就可以了,剩下的CRUD跟平常的开发过程并没有什么区别,这里就不多加详述了,下面直接把两个类型处理器的代码贴出来

package com.seerbigdata.common.handler;import com.kingbase8.geometric.KBpath;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;import java.sql.*;@MappedTypes(KBpath.class)
public class KBPathTypeHandler extends BaseTypeHandler<KBpath> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, KBpath parameter, JdbcType jdbcType) throws SQLException {// 构造path对象的值// KBpath的getValue方法会自动将坐标数据组装成可以存入数据库的字符串,详细的可以自行看源码,很简单ps.setObject(i, parameter.getValue(), Types.OTHER); // 使用 Types.OTHER 类型表示 KingBase 中的KBpath 类型}@Overridepublic KBpath getNullableResult(ResultSet rs, String columnName) throws SQLException {// 从 ResultSet 获取 Kingbase 中 KBpath 类型,并转换为 KBpath 对象Object object = rs.getObject(columnName);return (KBpath) object;}@Overridepublic KBpath getNullableResult(ResultSet rs, int columnIndex) throws SQLException {// 从 ResultSet 获取 Kingbase 中 KBpath 类型,并转换为 KBpath 对象Object object = rs.getObject(columnIndex);return (KBpath) object;}@Overridepublic KBpath getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {// 从 CallableStatement 获取 Kingbase 中 KBpath 类型,并转换为 KBpath 对象Object object = cs.getObject(columnIndex);return (KBpath) object;}
}
package com.seerbigdata.common.handler;import com.kingbase8.geometric.KBpoint;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;import java.sql.*;@MappedTypes(KBpoint.class)
public class KBPointTypeHandler extends BaseTypeHandler<KBpoint> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, KBpoint parameter, JdbcType jdbcType) throws SQLException {// 将 Point 对象转换为 Kingbase 中 POINT 类型ps.setObject(i,parameter.getValue(),Types.OTHER);}@Overridepublic KBpoint getNullableResult(ResultSet rs, String columnName) throws SQLException {// 从 ResultSet 获取 Kingbase 中 POINT 类型,并转换为 Point 对象Object object = rs.getObject(columnName);return (KBpoint) object;}@Overridepublic KBpoint getNullableResult(ResultSet rs, int columnIndex) throws SQLException {// 从 ResultSet 获取 Kingbase 中 POINT 类型,并转换为 Point 对象Object object = rs.getObject(columnIndex);return (KBpoint) object;}@Overridepublic KBpoint getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {// 从 CallableStatement 获取 Kingbase 中 POINT 类型,并转换为 Point 对象Object object = cs.getObject(columnIndex);return (KBpoint) object;}
}

有了这两个类型处理器,接下来就只需要在CRUD的时候能关联上对应的处理器进行处理就好了。

mapper xml

<?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="com.seerbigdata.assets.mapper.AssertsLocationMapper"><resultMap id="assertsLocationMap" type="com.seerbigdata.assets.domain.po.AssertsLocation"><id property="id" column="id" /><result property="fid" column="fid" /><!-- 指定类型处理器 --><result property="centre" column="centre" javaType="com.kingbase8.geometric.KBpoint" jdbcType="OTHER"typeHandler="com.seerbigdata.common.handler.KBPointTypeHandler" /><result property="area" column="area" /><result property="boundary" column="boundary" javaType="com.kingbase8.geometric.KBpath" jdbcType="OTHER"typeHandler="com.seerbigdata.common.handler.KBPathTypeHandler" /><result property="createTime" column="create_time"/><result property="createBy" column="create_by"/><result property="updateTime" column="update_time"/><result property="updateBy" column="update_by"/></resultMap><select id="listAssertsLocations" resultMap="assertsLocationMap">select * from busi_assets_location where fid = #{fid}</select></mapper>

mapper

package com.seerbigdata.assets.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.seerbigdata.assets.domain.po.AssertsLocation;
import com.seerbigdata.assets.domain.po.Contract;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;import java.util.List;@Mapper
public interface AssertsLocationMapper extends BaseMapper<AssertsLocation> {/*** 地理位置信息查询* @param fid* @return*/List<AssertsLocation> listAssertsLocations(@Param("fid") String fid);
}

后记

经过测试,已经可以正常对数据进行CRUD,接口也能正常返回坐标数据;但是数据的结构仍然是以{x:101.22222,y:33.0000}这种json格式返回给前端与自己定义两个数据库字段的区别不是很大,但在数据库层面可以使用PostgreSQL中的地理位置信息函数,这块有兴趣的话可以看下开发手册。
前端要求要标准的geo格式进行数据返回,例如:[101.22222,33.0000]这种格式,最终为了方便还是采用mongoDB来进行数据存储。

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

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

相关文章

linux中彻底卸载jenkins

要彻底卸载 Jenkins&#xff0c;你需要删除与 Jenkins 相关的文件、目录和配置。以下是一些步骤: 1. **停止 Jenkins 服务&#xff1a;** 在卸载 Jenkins 之前&#xff0c;首先停止 Jenkins 服务。使用以下命令停止 Jenkins 服务&#xff1a; sudo systemctl stop jenki…

Mr. Cappuccino的第56杯咖啡——Mybatis拦截器

Mybatis拦截器 概述应用场景项目结构实现分页查询其它拦截器的使用 概述 Mybatis允许使用者在映射语句执行过程中的某一些指定的节点进行拦截调用&#xff0c;通过织入拦截器&#xff0c;在不同节点修改一些执行过程中的关键属性&#xff0c;从而影响SQL的生成、执行和返回结果…

LLVM笔记2 Intermediate Representation (IR)

参考链接&#xff1a;https://llvm.org/devmtg/2019-04/slides/Tutorial-Bridgers-LLVM_IR_tutorial.pdf https://zhuanlan.zhihu.com/p/163063995 https://zhuanlan.zhihu.com/p/163328574 文章目录 IR的布局1. IR语法2.IR递归函数3.使用迭代的方式4.全局变量5.LLVM’s type s…

【模型加速部署】—— Pytorch自动混合精度训练

自动混合精度 torch. amp为混合精度提供了方便的方法&#xff0c;其中一些操作使用torch.float32&#xff08;浮点&#xff09;数据类型&#xff0c;而其他操作使用精度较低的浮点数据类型&#xff08;lower_precision_fp&#xff09;&#xff1a;torch.float16(half)或torch.…

(03)Unity HTC VRTK 基于 URP 开发记录

1.简介 本篇主要内容为&#xff1a;URP如何与VRTK结合、URP需要注意的地方、VRTK的功能进行阐述。 因项目本身要求要渲染出比较好的画质&#xff0c;所以抛弃了Unity默认渲染管线Built-in&#xff0c;使用URP进行渲染&#xff0c;当然也可以选HDRP&#xff0c;但考虑到后期项目…

Stable Diffusion教程(9) - AI视频转动漫

配套抖音视频教程&#xff1a;https://v.douyin.com/UfTcrcJ/ 安装mov2mov插件 打开webui点击扩展->从网址安装输入地址&#xff0c;然后点击安装 https://github.com/Scholar01/sd-webui-mov2mov 最后重启webui 下载模型 从国内liblib AI 模型站下载模型 LiblibAI哩…

锦程消费金融业务生变:App下架,部分自营信贷暂停

来源 | 镭射财经&#xff08;leishecaijing&#xff09; 被誉为消金房抵一哥的锦程消费金融&#xff0c;调整旗下自营信贷业务&#xff0c;展业回归房抵场景。 「镭射财经」独家获悉&#xff0c;锦程消费金融已暂停部分自营小额信贷业务&#xff0c;旗下锦囊贷App已经下架&am…

通过anvt X6和vue3实现图编辑

通过anvt X6 X6地址&#xff1a;https://x6.antv.antgroup.com/tutorial/about&#xff1b; 由于节点比较复杂&#xff0c;使用vue实现的节点&#xff1b; x6提供了一个独立的包 antv/x6-vue-shape 来使用 Vue 组件渲染节点。 VUE3的案例&#xff1a; <template><div…

软工导论知识框架(五)面向对象方法学

传统软件工程方法学适用于中小型软件产品开发&#xff1b; 面向对象软件工程方法学适用于大型软件产品开发。 一.四要素 对象&#xff0b;类&#xff0b;继承&#xff0b;传递消息实现通信 二.概念 1.对象&#xff1a;具有相同状态的一组操作的集合&#xff0c;对状态和操作…

数据挖掘全流程解析

数据挖掘全流程解析 数据指标选择 在这一阶段&#xff0c;使用直方图和柱状图的方式对数据进行分析&#xff0c;观察什么数据属性对于因变量会产生更加明显的结果。 如何绘制直方图和条形统计图 数据清洗 观察数据是否存在数据缺失或者离群点的情况。 数据异常的两种情况…

Golang实现Redis分布式锁解决秒杀问题

先写一个脚本sql&#xff0c;插入2000个用户 INSERT INTO sys_users (mobile, password) SELECT numbers.n AS mobile,$2a$10$zKQfSn/GCcR6MX4nHk3MsOMhJnI0qxN4MFdiufDMH2wzuTaR9G1sq AS password FROM (SELECT ones.n tens.n*10 hundreds.n*100 thousands.n*1000 1 AS n…

成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】

成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】 问题描述解决方案 问题描述 在下载安装包的时候一直卡在0% [Waiting for headers]&#xff0c;报错信息如下&#xff1a; Get:1 file:/var/cudnn-local-repo-ubuntu1804-8.5.0.96 InRelease […

[国产MCU]-BL602开发实例-PWM

PWM 文章目录 PWM1、BL602的PWM介绍2、PWM驱动API介绍3、PWM使用示例脉冲宽度调制(Pulse width modulation,简称PWM)是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳定电源输出的改变。这种方…

【目标检测系列】YOLOV1解读

前言 从R-CNN到Fast-RCNN&#xff0c;之前的目标检测工作都是分成两阶段&#xff0c;先提供位置信息在进行目标分类&#xff0c;精度很高但无法满足实时检测的要求。 而YoLo将目标检测看作回归问题&#xff0c;输入为一张图片&#xff0c;输出为S*S*(5*BC)的三维向量。该向量…

react class与hooks区别

在React中&#xff0c;有两种主要的方式来管理组件的状态和生命周期&#xff1a;Class 组件和 Hooks。 Class 组件&#xff1a; Class 组件是 React 最早引入的方式&#xff0c;它是基于 ES6 class 的语法来创建的。Class 组件包含了生命周期方法&#xff0c;可以用来处理组件…

docker菜谱大全

记录docker常用软件安装&#xff0c;感谢小马哥和杨师傅的投稿。&#x1f60e;&#x1f60e;&#x1f60e; 相关文档&#xff1a; DockerHub&#xff1a;https://hub.docker.com/Linux手册&#xff1a;https://linuxcool.com/Docker文档&#xff1a;https://docs.docker.com/Do…

ubuntu 暂时不能解析域名 解决办法

需要修改系统DNS 打开终端&#xff1a;输入 sudo vi /etc/resolv.conf 回车 在打开的配置文件中添加DNS信息 nameserver 114.114.114.114 nameserver 8.8.8.8 保存退出&#xff0c;重启系统即可。

20230802-下载并安装android-studio

下载 android-studio 安装包 https://developer.android.google.cn/studio/ 安装android-studio 双击安装包 D:\Android Studio

银河麒麟V10 SP3 X86 二进制文件部署 mysql-5.7.29 GTID 半同步复制的双主架构

文章目录 [toc]啰嗦一下mysql 的 AB 复制和 gtid 复制的优缺点AB 复制&#xff08;Asynchronous Replication&#xff09;GTID 复制&#xff08;Global Transaction Identifier Replication&#xff09; mysql gtid 并行复制和半同步复制的优缺点并行复制&#xff08;Parallel …

Android平台一对一音视频通话方案对比:WebRTC VS RTMP VS RTSP

一对一音视频通话使用场景 一对一音视频通话都需要稳定、清晰和流畅&#xff0c;以确保良好的用户体验&#xff0c;常用的使用场景如下&#xff1a; 社交应用&#xff1a;社交应用是一种常见的使用场景&#xff0c;用户可以通过音视频通话进行面对面的交流&#xff1b;在线教…