发布时间:2026-07-21阅读(1)
原文链接:https://blog.51cto.com/lovebetterworld/5296681Mybatis-plus读取和保存Postgis geometry数据,下面我们就来聊聊关于mybatis从数据库获取的数据类型?接下来我们就一起去了解一下吧!

mybatis从数据库获取的数据类型
原文链接:https://blog.51cto.com/lovebetterworld/5296681
Mybatis-plus读取和保存Postgis geometry数据
SpringBoot项目,数据库为PostgreSQL,集成了PostGIS,需要实现Geometry数据的类型转换问题。
Maven依赖<dependency><groupId>net.postgis</groupId><artifactId>postgis-jdbc</artifactId><version>2.5.0</version></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.6</version></dependency>
import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.MappedTypes;import org.postgis.PGgeometry;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;@MappedTypes({String.class})public class MyGeometryTypeHandler extends BaseTypeHandler<String> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {PGgeometry pGgeometry = new PGgeometry(parameter);ps.setObject(i, pGgeometry);}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {PGgeometry pGgeometry = new PGgeometry(rs.getString(columnName));if (pGgeometry == null) {return null;}return pGgeometry.toString();}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {PGgeometry pGgeometry = new PGgeometry(rs.getString(columnIndex));if (pGgeometry == null) {return null;}return pGgeometry.toString();}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {PGgeometry pGgeometry = new PGgeometry(cs.getString(columnIndex));if (pGgeometry == null) {return null;}return pGgeometry.toString();}}
@TableField(typeHandler = GeometryTypeHandler.class)private String wkb;
看到3部分的时候,相当于拦截器都已经实现好了,但是怎么验证呢?
自己试了半天,也没找到方法,一直抱怨类型转换错误,然后就开始断点一步一步向下走,最后发现了蹊跷。
在断点走到GeometryBuilder.class类中,才发现关键代码。
public static Geometry geomFromString(String value, BinaryParser bp, boolean haveM) throws SQLException {value = value.trim();int srid = 0;if (value.startsWith("SRID=")) {String[] parts = splitSRID(value);value = parts[1].trim();srid = Geometry.parseSRID(Integer.parseInt(parts[0].substring(5)));}//关键代码,解析传过来的数据类型Object result;if (!value.startsWith("00") && !value.startsWith("01")) {if (value.endsWith("EMPTY")) {result = new GeometryCollection();} else if (value.startsWith("MULTIPOLYGON")) {result = new MultiPolygon(value, haveM);} else if (value.startsWith("MULTILINESTRING")) {result = new MultiLineString(value, haveM);} else if (value.startsWith("MULTIPOINT")) {result = new MultiPoint(value, haveM);} else if (value.startsWith("POLYGON")) {result = new Polygon(value, haveM);} else if (value.startsWith("LINESTRING")) {result = new LineString(value, haveM);} else if (value.startsWith("POINT")) {result = new Point(value, haveM);} else {if (!value.startsWith("GEOMETRYCOLLECTION")) {throw new SQLException("Unknown type: " value);}result = new GeometryCollection(value, haveM);}} else {result = bp.parse(value);}if (srid != 0) {((Geometry)result).srid = srid;}return (Geometry)result;}
4.1 示例封装数据
前端,可以封装一个专门的GIS组件,传数据。
本质上可以是数据构造成如下格式:
let Point = POINT(138.22 39.22);
后端,为方便测试,直接拼接个字符串。
String gps = POINT(138.22 39.22);//然后正常Mybatis的持久化即可。
Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图