Java 定義類型處理MySQL point類型數據

1.三個類來處理

引入maven依賴

        <!-- 引入 jts 庫解析 POINT --><dependency><groupId>com.vividsolutions</groupId><artifactId>jts</artifactId><version>1.13</version></dependency>

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.io.Serializable;/***  經緯度對象* <br>*  x 經度 lon 浮點數,范圍為180 ~ -180 <br>*  y 緯度 lat 浮點數,范圍為90 ~ -90*/
public class GeoPoint implements Serializable {/*** 參數校驗*  在lon、lat 字段添加@Min @Max 注解,并且在使用該類的地方加 @Valid 注解*  如:*   @Valid*   private GeoPoint lonlat;*/// controller @RequestBody 參數內嵌套對象,必須有一個無參的構造函數public GeoPoint() {}/*** 經度*/@Min(value = -180, message = "經度lon不能小于-180")@Max(value = 180, message = "經度lon不能大于180")private double lon;/*** 緯度*/@Min(value = -90, message = "緯度lat不能小于-90")@Max(value = 90, message = "緯度lat不能大于90")private double lat;/**** @param x 經度 lon 浮點數,范圍為180 ~ -180* @param y 緯度 lat 浮點數,范圍為90 ~ -90*/public GeoPoint(double x, double y) {this.lon = x;this.lat = y;}public double getLon() {return lon;}public void setLon(double lon) {this.lon = lon;}public double getLat() {return lat;}public void setLat(double lat) {this.lat = lat;}@Overridepublic String toString() {return "GeoPoint{" +"lon=" + lon +", lat=" + lat +'}';}}

import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequence;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequenceFactory;
import com.vividsolutions.jts.io.*;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class GeoPointConverter {/*** Little endian or Big endian*/private int byteOrder = ByteOrderValues.LITTLE_ENDIAN;/*** Precision model*/private PrecisionModel precisionModel = new PrecisionModel();/*** Coordinate sequence factory*/private CoordinateSequenceFactory coordinateSequenceFactory = CoordinateArraySequenceFactory.instance();/*** Output dimension*/private int outputDimension = 2;/*** Convert byte array containing SRID + WKB Geometry into Geometry object*/public GeoPoint from(byte[] bytes) {if (bytes == null) {return null;}try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) {// Read SRIDbyte[] sridBytes = new byte[4];inputStream.read(sridBytes);int srid = ByteOrderValues.getInt(sridBytes, byteOrder);// Prepare Geometry factoryGeometryFactory geometryFactory = new GeometryFactory(precisionModel, srid, coordinateSequenceFactory);// Read GeometryWKBReader wkbReader = new WKBReader(geometryFactory);Geometry geometry = wkbReader.read(new InputStreamInStream(inputStream));Point point = (Point) geometry;// convert to GeoPointGeoPoint geoPoint = new GeoPoint(point.getX(), point.getY());return geoPoint;} catch (IOException | ParseException e) {throw new IllegalArgumentException(e);}}/*** Convert Geometry object into byte array containing SRID + WKB Geometry*/public byte[] to(GeoPoint geoPoint) {if (geoPoint == null) {return null;}//  @param x 經度 lon//  @param y 緯度 latCoordinate coordinate = new Coordinate(geoPoint.getLon(), geoPoint.getLat());CoordinateArraySequence coordinateArraySequence = new CoordinateArraySequence(new Coordinate[]{coordinate}, 2);Point point = new Point(coordinateArraySequence, new GeometryFactory());try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {// Write SRIDbyte[] sridBytes = new byte[4];ByteOrderValues.putInt(point.getSRID(), sridBytes, byteOrder);outputStream.write(sridBytes);// Write GeometryWKBWriter wkbWriter = new WKBWriter(outputDimension, byteOrder);wkbWriter.write(point, new OutputStreamOutStream(outputStream));return outputStream.toByteArray();} catch (IOException ioe) {throw new IllegalArgumentException(ioe);}}
}

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 org.springframework.stereotype.Component;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;@Component //注入Bean,全局配置使其自動轉換,不需要在sql層手動指定
@MappedJdbcTypes(JdbcType.OTHER) // JdbcType只能用OTHER類型,沒有point類型
@MappedTypes(GeoPoint.class) 
public class GeoPointTypeHandler extends BaseTypeHandler<GeoPoint> {GeoPointConverter converter = new GeoPointConverter();@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, GeoPoint parameter, JdbcType jdbcType) throws SQLException {ps.setBytes(i, converter.to(parameter));}@Overridepublic GeoPoint getNullableResult(ResultSet rs, String columnName) throws SQLException {return converter.from(rs.getBytes(columnName));}@Overridepublic GeoPoint getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return converter.from(rs.getBytes(columnIndex));}@Overridepublic GeoPoint getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return converter.from(cs.getBytes(columnIndex));}
}

2.使用

model中使用?


public class PositionInfo implements Serializable
{private static final long serialVersionUID = 1L;/** 經緯度 */@Valid //接口中使用 @Valid 對參數 PositionInfo 進行校驗,需要在這里也加@Valid 注解private GeoPoint lonlat;//....
}

controller

@Validated
@RestController
@RequestMapping("/positioninfo")
public class PositionInfoController
{@Autowiredprivate PositionInfoService positionInfoService;/*** 新增地理位置信息*/@PostMappingpublic Result addPositionInfo( @RequestBody @Valid PositionInfo positionInfo){System.err.println(positionInfo);return reult(positionInfoService.insertPositionInfo(positionInfo));}

DAO

@Select("select * from position_info_table")
//    @Results(
//        @Result(column = "lonlat",property = "lonlat",
//                javaType = GeoPoint.class,typeHandler = GeoPointTypeHandler.class)
//    )List<PositionInfo> listPositionInfo(PositionInfo positionInfo);@Insert("insert into position_info_table (lonlat) values (#{p.lonlat})" )int insertPositionInfo(@Param("p") PositionInfo positionInfo);

測試

--------


# 無效,解決:在GeoPointTypeHandler 使用 @Component
#配置point解析工具GeoPointTypeHandler,使其自動轉換,不需要在sql層手動指定
#mybatis:
#    type-handlers-package:com.jeaglo.auxpolice.tools

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13962.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13962.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13962.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL的數據類型之文本類型

目錄 文本類型類型&#xff1a; CHAR(size) VARCHAR(size) TEXT TINYTEXT, MEDIUMTEXT, LONGTEXT BLOB, MEDIUMBLOB, LONGBLOB ENUM 在mysql中&#xff0c;常用數據類型有三種&#xff1a; 1、文本類型&#xff1b; 2、數字類型&#xff1b; 3、日期/時間類型&#xff1b; …

【C++入門】—— C++入門 (下)_內聯函數

前言&#xff1a;在了解完前面的C基礎內容后&#xff0c;馬上我們就要真正不如C的學習了&#xff0c;但在之前讓我們最后了解最后一點點C入門知識&#xff01;來遲的520特別篇&#xff01; 本篇主要內容&#xff1a; 內聯函數 auto關鍵字 范圍for 指針空值nullptr C入門 1. 內聯…

星戈瑞CY3-COOH染料的穩定性、熒光特性

CY3-COOH染料&#xff0c;作為一種多功能的熒光標記試劑&#xff0c;在生物醫學研究和熒光成像技術中應用。其穩定性和熒光特性使得它在科研實驗使用。 CY3-COOH染料的穩定性 CY3-COOH染料以其穩定性而應用。首先&#xff0c;它展現出了良好的化學穩定性&#xff0c;不易受到環…

智慧醫療時代:探索互聯網醫院開發的新篇章

在智慧醫療時代&#xff0c;互聯網醫院開發正引領著醫療服務的創新浪潮。通過將先進的技術與醫療服務相結合&#xff0c;互聯網醫院為患者和醫生提供了全新的互動方式&#xff0c;極大地提升了醫療服務的便捷性和效率。本文將深入探討互聯網醫院的開發&#xff0c;介紹其技術實…

一鍵部署!QQ AI 聊天機器人!支持ChatGPT、文心一言、訊飛星火、Bing、Bard、ChatGLM、POE,多賬號,人設調教

隨著人工智能技術的不斷發展&#xff0c;智能聊天機器人已經成為我們日常生活中不可或缺的一部分。ChatGPT作為一款強大的人工智能聊天模型&#xff0c;能夠為我們提供高效、便捷的聊天體驗。那么&#xff0c;如何將ChatGPT接入QQ&#xff0c;實現智能聊天新體驗呢&#xff1f;…

關于Git 的基本概念和使用方式

Git是一個分布式版本控制系統&#xff0c;用于跟蹤和管理代碼的改動。它具有以下基本概念和使用方式&#xff1a; 1. 倉庫&#xff08;Repository&#xff09;&#xff1a;Git使用倉庫來存儲代碼和相關的歷史記錄。倉庫可以是本地的&#xff0c;也可以是遠程的。本地倉庫保存在…

DB2學習筆記--1

一 數據控制語言(DCL) 1.GRANT語句 使用 GRANT 語句可以向單個用戶或組顯式授予權限和特權&#xff0c;授權對象包括數據庫、 表空間、表、視圖、索引、包和模式。 GRANT 的語法如下: GRANT privilege ON object-type object-name TO {USER|GROUP|PUBLIC} authorization-na…

OTP8腳-全自動擦鞋機WTN6020-低成本語音方案

一&#xff0c;產品開發背景 首先&#xff0c;隨著人們生活質量的提升&#xff0c;對鞋子的保養需求也日益增加。鞋子作為人們日常穿著的重要組成部分&#xff0c;其清潔度和外觀狀態直接影響到個人形象和舒適度。因此&#xff0c;一種能夠自動清潔和擦亮鞋子的設備應運而生&am…

局部直方圖均衡化去霧算法

目錄 1. 引言 2. 算法流程 3. 代碼 4. 去霧效果 1. 引言 局部直方圖算法是一種基于塊的圖像去霧方法&#xff0c;它將圖像分割為若干個塊&#xff0c;并在每個塊內計算塊的局部直方圖。通過對各個塊的直方圖進行分析和處理&#xff0c;該算法能夠更好地適應圖像中不同區域的…

正點原子[第二期]Linux之ARM(MX6U)裸機篇學習筆記-16講 EPIT定時器

前言&#xff1a; 本文是根據嗶哩嗶哩網站上“正點原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸機篇”視頻的學習筆記&#xff0c;在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。…

js是單線程還是多線程,為什么是線程而不是進程

JavaScript 在瀏覽器環境中主要是單線程的&#xff0c;而在 Node.js 環境中&#xff0c;雖然 JavaScript 代碼本身仍然是在單線程中執行的&#xff0c;但 Node.js 底層利用了多線程來處理 I/O 操作等異步任務。 下面我會解釋為什么 JavaScript 在瀏覽器環境中主要是單線程&…

再談Google I/O 2024:開發者必看亮點

在2024年Google I/O大會上&#xff0c;谷歌發布了許多令人興奮的新技術和工具。本文將重點介紹其中的三大亮點&#xff1a;新一代TPU、Gemma模型以及Firebase GenKit。這些工具和技術對于開發者來說&#xff0c;將會帶來前所未有的便利和強大功能。 新一代TPU&#xff1a;Tril…

centOS7.9 DNS配置

1.DNS規劃 dns.sohu.com192.168.110.111Awww.sohucom192.168.110.112Aoa.sohu.com 192.168.110.113A 2.安裝 bind yum install -y bind bind-utils 3. 編輯主配置文件 vim /etc/named.conflisten- on port 53 { any; }; allow- query { any; }; 4.配置區域文件 …

在MySQL數據庫中的視圖和事務。

視圖 view 臨時表 作用&#xff1a;優化多表查詢的效率 可以將經常使用的連接查詢結果使用視圖進行保存&#xff0c;避免多次重復的笛卡爾積運算 MySQL數據庫在多表查詢的時候會自動進行笛卡爾積運算。 如果將來經常要用到某一個多表查詢的結果就可以使用視圖將這個結果…

若依框架二次開發指南:從基礎到高級定制

若依框架&#xff08;RuoYi&#xff09;作為一個基于Spring Boot和MyBatis的快速開發平臺&#xff0c;其強大的功能和靈活的架構設計使其成為企業級應用開發的理想選擇。然而&#xff0c;隨著業務需求的不斷變化&#xff0c;原生的若依框架可能需要進行一定程度的定制和擴展。本…

前端面試題日常練-day30 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末。 1. 在Vue中&#xff0c;以下哪個選項用于根據條件渲染多個元素&#xff1f; a) v-if b) v-bind c) v-model d) v-for 2. Vue中&#xff0c;以下哪個選項用于在計算屬性中處理異步操作&#xff1f…

圖生視頻 學習筆記

目錄 免費文生視頻模型還支持4K分辨率——Viva open-sora 潞晨科技 圖生視頻Runway Pika 文生視頻、圖生視頻 免費文生視頻模型還支持4K分辨率——Viva 1、文生視頻 2、圖生視頻 3、視頻4K高清 4、區域重繪 5、自動擴圖 6、區域摳圖 作者&#xff1a;C叔聊歷史 https:…

Visual Studio中MP編譯參數

MP通常與OpenMP&#xff08;Open Multi-Processing&#xff09;關聯&#xff0c;它是用于多平臺共享內存并行編程的一個API。 在編譯C或C代碼時使用OpenMP&#xff0c;通常需要特定的編譯參數來啟用這一功能。對于GCC和G編譯器&#xff0c;這些參數包括&#xff1a; -fopenmp…

Java虛擬機原理(上)-揭秘Java GC黑匣子-知其所以然,從此不再捆手捆腳

對于Java開發者來說&#xff0c;GC(垃圾回收器)就如同一個神秘的黑匣子&#xff0c;它在背后不知疲倦地運作&#xff0c;卻也時常給我們帶來諸多疑惑和挫折。今天&#xff0c;就讓我們切開這個黑匣子&#xff0c;深入解析Java GC的工作原理&#xff0c;助你了解其中的奧秘&…

SpringBoot anyline

1、定義通用處理 public interface ClickHouseBaseService extends IService<DataRow> {/*** 根據sql查詢數據庫&#xff0c;返回集合對象** param sql 執行sql* return {link DataSet} 數據集*/DataSet querys(String sql);/*** 根據sql查詢數據庫&#xff0c;返回單個…