mybatisplus集成geometry实现增改功能

前言

在我们工作中想要实现将空间点位信息存储到数据库时,一般使用以下语句实现

INSERT INTO `test-point` ( point,text ) VALUES ( st_GeomFromText ( 'POINT(1 1)' ),'第1个点');
update `test-point` set point=st_PointFromText('POINT(5 5)') where id =10;

但是这样每次都要去编写新增与编辑的sql语句非常麻烦,体现不出mybatisplus的便捷性,所以可以增加GeometryTypeHandler在mybatisplus生成新增编辑语句时将st_GeomFromText ()函数拼接到sql语句上,更加方便快捷

一.准备工作

  1. 首先项目添加依赖:
<dependency><groupId>com.vividsolutions</groupId><artifactId>jts</artifactId><version>1.13</version>
</dependency>
  1. 在项目中加入GeometryTypeHandler
package com.sinosoft.springbootplus.lft.business.dispatch.map.common;import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.PrecisionModel;
import com.vividsolutions.jts.io.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;@MappedTypes({String.class})
@MappedJdbcTypes({JdbcType.OTHER})
@Slf4j
public class GeometryTypeHandler extends BaseTypeHandler<String> {@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {try{//String转GeometryGeometry geo = new WKTReader(new GeometryFactory(new PrecisionModel())).read(s);// Geometry转WKBbyte[] geometryBytes = new WKBWriter(2, ByteOrderValues.LITTLE_ENDIAN, false).write(geo);// 设置SRID为mysql默认的 0byte[] wkb = new byte[geometryBytes.length+4];wkb[0] = wkb[1] = wkb[2] = wkb[3] = 0;System.arraycopy(geometryBytes, 0, wkb, 4, geometryBytes.length);preparedStatement.setBytes(i,wkb);}catch (ParseException e){log.error("坐标转换异常:【{}】",e.getMessage(),e);}}@Overridepublic String getNullableResult(ResultSet resultSet, String s){try(InputStream inputStream = resultSet.getBinaryStream(s)){Geometry geo = getGeometryFromInputStream(inputStream);if(geo != null){return geo.toString();}}catch(Exception e){log.error("坐标转换异常:【{}】",e.getMessage(),e);}return null;}@Overridepublic String getNullableResult(ResultSet resultSet, int i){try(InputStream inputStream = resultSet.getBinaryStream(i)){Geometry geo = getGeometryFromInputStream(inputStream);if(geo != null){return geo.toString();}}catch(Exception e){log.error("坐标转换异常:【{}】",e.getMessage(),e);}return null;}@Overridepublic String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {return "";}/*** 流 转 geometry* */private  Geometry getGeometryFromInputStream(InputStream inputStream) throws Exception {Geometry dbGeometry = null;if (inputStream != null) {// 二进制流转成字节数组byte[] buffer = new byte[255];int bytesRead;ByteArrayOutputStream baos = new ByteArrayOutputStream();while ((bytesRead = inputStream.read(buffer)) != -1) {baos.write(buffer, 0, bytesRead);}// 得到字节数组byte[] geometryAsBytes = baos.toByteArray();// 字节数组小于5 异常if (geometryAsBytes.length < 5) {throw new RuntimeException("坐标异常");}//字节数组前4个字节表示srid 去掉byte[] sridBytes = new byte[4];System.arraycopy(geometryAsBytes, 0, sridBytes, 0, 4);boolean bigEndian = (geometryAsBytes[4] == 0x00);// 解析sridint srid = 0;if (bigEndian) {for (byte sridByte : sridBytes) {srid = (srid << 8) + (sridByte & 0xff);}} else {for (int i = 0; i < sridBytes.length; i++) {srid += (sridBytes[i] & 0xff) << (8 * i);}}WKBReader wkbReader = new WKBReader();// WKBReader 把字节数组转成geometry对象。byte[] wkb = new byte[geometryAsBytes.length - 4];System.arraycopy(geometryAsBytes, 4, wkb, 0, wkb.length);dbGeometry = wkbReader.read(wkb);dbGeometry.setSRID(srid);}return dbGeometry;}
}

二.使用

找到相对应的空间点位字段,加上注解:

@TableField(typeHandler = GeometryTypeHandler.class)
如下图
在这里插入图片描述
这样的话正常传入字段内容point(1 2),在新增和编辑时mybatisplus就会自动拼接st_GeomFromText (),实现空间点位数据的录入和编辑了.

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

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

相关文章

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio快速构建React完成点餐H5页面还原

文章目录 一、前言二、Cloud Studio 功能介绍三、实验介绍四、实操指导打开官网注册 Cloud Studio 五、开发一个简版的点餐系统安装 antd-mobile安装 Less 六、发布仓库七、开发空间八、总结 一、前言 IDE&#xff08;集成开发环境&#xff09;是一种软件工具&#xff0c;旨在…

Mybatis引出的一系列问题-动态 SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架&#xff0c;你应该能理解根据不同条件拼接 SQL 语句有多痛苦&#xff0c;例如拼接时要确保不能忘记添加必要的空格&#xff0c;还要注意去掉列表最后一个列名的逗号。利用动态 SQL&#xff0c;可以彻底…

IDEA Go语言开发环境无法debug调试

现象描述 使用idea 搭建go开发环境后如果debug调试可能会遇到错误&#xff1a; could not launch process: decoding dwarf section info at offset 0x0: too short。 解决方法 有些回答go get -u github.com/derekparker/delve/cmd/dlv 。现在如果使用go mod方式的话这个是…

c++转换构造,拷贝构造,operator=

c转换构造&#xff0c;拷贝构造&#xff0c;operator 一.转换构造 定义一个类 class CTest { public:int m_a;CTest(int m_a):m_a(0){} };在主函数中定义对象 CTest tes1(1); CTest tes2 5;//我们发现这种定义对象的方式不符合常理&#xff0c;这里其实是发生了隐式类型转…

【Android】Retrofit2和RxJava2新手快速上手

写这篇博客的目的 网上关于Retrofit2和RxJava2的博客特别多&#xff0c;但是内容特别复杂&#xff0c;一上来就讲解很高级的用法 其实我们没必要像高考做题家一样&#xff0c;把每个API都背的滚瓜烂熟 熟悉基本用法&#xff0c;高阶用法需要的时候再逐个了解就行了 因为博客…

R语言linkET包绘制相关性组合网络热图

热图就是使用颜色来表示数据相关性的图。能绘制热图的R包很多&#xff0c;既往我们已经介绍了《R语言pheatmap包绘制热图》&#xff0c;今天咱们来介绍一下R语言linkET包绘制相关性组合网络热图。相关性热图的意思热图和其他数据的关联性&#xff0c;比较的是多数据间的内在关系…

【宝藏系列】Linux 常用磁盘管理命令详解

【宝藏系列】Linux 常用磁盘管理命令详解 文章目录 【宝藏系列】Linux 常用磁盘管理命令详解前言1️⃣ df2️⃣du3️⃣fdisk&#x1f4df;磁盘格式化&#x1f4e0;磁盘检验⌨️磁盘挂载与卸除&#x1f4c0;卸载/dev/hdc6 前言 Linux磁盘管理常用三个命令为df、du和fdisk。 df…

Stable Diffusion教程(6) - 扩展安装

打开stable diffusion webUI界面 加载插件列表 依次点击扩展->可用->加载自 搜索插件 首先在搜索框输入你要安装的插件&#xff0c;然后点击插件后面的安装按钮 如果你需要的插件这里面没有找到&#xff0c;可通过通网址安装的方式安装。 在git仓库网址输入框输入的你插件…

招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本 tbms

​功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…

【算法第十六天7.31】654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

链接力扣654-最大二叉树 思路 class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return getRoot(nums,0,nums.length);}public TreeNode getRoot(int[] nums,int leftIndex,int rightIndex){// 已经没有节点if(rightIndex - leftIndex < 1) ret…

强化学习分享(一) DQN算法原理及实现

摘要&#xff1a;主要讲解DQN算法的原理&#xff0c;伪代码解读&#xff0c;基于pytorch版本的DQN小游戏编程&#xff0c;同时对该代码进行详细标注&#xff0c;以及奉上原码。 &#xff08;一&#xff09;强化学习算法介绍 DQN&#xff0c;顾名思义&#xff0c;Deep Q Learni…

layui中渲染table表格

页面布局 可直接根据文档要求去写 table 组件&#xff08;这个不重要&#xff09; <table lay-filter"SyDictTable" id"SyDictTable" lay-data"{id: SyDictTable}"></table>Js 重要的是去修改JS里面的东西&#xff0c;比如&#…

LeetCode 0822. 翻转卡片游戏:双O(n)的做法

【LetMeFly】822.翻转卡片游戏&#xff1a;双O(n)的做法 力扣题目链接&#xff1a;https://leetcode.cn/problems/card-flipping-game/ 在桌子上有 N 张卡片&#xff0c;每张卡片的正面和背面都写着一个正数&#xff08;正面与背面上的数有可能不一样&#xff09;。 我们可以…

动态开点线段树

防止原来的区间太大(比如n的范围为1e9&#xff0c;询问的个数为1e5)&#xff0c;此时我们就可以动态开点&#xff0c;防止普通线段树的空间过大导致MLE。 题目链接&#xff1a;E. Physical Education Lessons 区间查询&#xff0c;区间修改&#xff1a; #include <bits/s…

飞凌嵌入式「国产」平台大盘点(二)全志系列

在上篇文章中&#xff0c;小编带大家一起盘点了飞凌嵌入式国产平台中的瑞芯微系列核心板。本篇文章&#xff0c;将继续为大家介绍的是全志系列核心板&#xff0c;话不多说&#xff0c;上干货&#xff01; 全志科技 飞凌嵌入式 飞凌嵌入式与全志科技的合作始于2019年&#xff…

Opencv C++实现yolov5部署onnx模型完成目标检测

代码分析&#xff1a; 头文件 #include <fstream> //文件 #include <sstream> //流 #include <iostream> #include <opencv2/dnn.hpp> //深度学习模块-仅提供推理功能 #include <opencv2/imgproc.hpp> //图像处理模块 #include &l…

AI 绘画Stable Diffusion 研究(四)sd文生图功能详解(上)

大家好&#xff0c;我是风雨无阻。 通过前面几篇AI 绘画Stable Diffusion 研究系列的介绍&#xff0c;我们完成了Stable Diffusion整合包的安装、模型ControlNet1.1 安装、模型种类介绍与安装&#xff0c;相信看过教程的朋友们&#xff0c;手上已经有可以操作实践的Stable Diff…

论文阅读-BotPercent: Estimating Twitter Bot Populations from Groups to Crowds

目录 摘要 引言 方法 数据集 BotPercent架构 实验结果 活跃用户中的Bot数量 Bot Population among Comment Sections Bot Participation in Content Moderation Votes Bot Population in Different Countries’ Politics 论文链接&#xff1a;https://arxiv.org/pdf/23…

HTML 元素的属性有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ class⭐ id⭐ style⭐ src⭐ href⭐ alt⭐ width和height⭐ disabled⭐ value⭐ required⭐ placeholder⭐ checked⭐ selected⭐ target⭐ colspan和rowspan⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得…

争夺年度智能汽车「中间件」方案提供商TOP10,谁率先入围

进入2023年&#xff0c;整车电子架构升级进入新周期&#xff0c;无论是智能驾驶、智能座舱、车身控制还是信息网络安全&#xff0c;软件赋能仍是行业的主旋律。 作为智能汽车赛道的第三方研究咨询机构&#xff0c;高工智能汽车研究院持续帮助车企、投资机构挖掘具备核心竞争力…