请选择 进入手机版 | 继续访问电脑版

JeeGit 官方论坛

找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

1

收听

0

听众

181

主题
发表于 2022-11-21 13:45:42 | 查看: 788| 回复: 0
mybatis读写数据库 geometry类型数据https://blog.csdn.net/s_hloo/article/details/111311022







  1. 数据库字段类型 :geometry

  2. 引入geo工具包   com.vividsolutions  版本1.13

  3. 方式1 :使用mysql函数    ST_AsText: 可将mysql的geometry类型转换成 string类型, ST_GeometryFromText :  将wkt描述的字符串转换为 mysql中geometry类型, 这种方法简单直接,但需编写原生sql,不支持mybatis insert update之类的方法。

  4. 方式2 :使用mybatis自定义类型转换器主要代码

  5. <result column="coordinate"  property="coordinate" typeHandler="GeometryTypeHandler"/>
  6.         @TableField(typeHandler = GeometryTypeHandler.class)
  7.         private String coordinate;


  8. @MappedTypes({String.class})
  9. @MappedJdbcTypes({JdbcType.OTHER})
  10. public class GeometryTypeHandler extends BaseTypeHandler<String> {


  11.         @Override
  12.         public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {


  13.                         Geometry geo = null;
  14.                         try{
  15.                                 //String转Geometry
  16.                                 geo = new WKTReader(new GeometryFactory(new PrecisionModel())).read(s);
  17.                                 // Geometry转WKB
  18.                                 byte[] geometryBytes = new WKBWriter(2, ByteOrderValues.LITTLE_ENDIAN, false).write(geo);
  19.                                 // 设置SRID为mysql默认的 0
  20.                                 byte[] wkb = new byte[geometryBytes.length+4];
  21.                                 wkb[0] = wkb[1] = wkb[2] = wkb[3] = 0;
  22.                                 System.arraycopy(geometryBytes, 0, wkb, 4, geometryBytes.length);
  23.                                 preparedStatement.setBytes(i,wkb);
  24.                         }catch (ParseException e){
  25.                                
  26.                         }
  27.                 }
  28.         }

  29.         @Override
  30.         public String getNullableResult(ResultSet resultSet, String s){
  31.                 try(InputStream inputStream = resultSet.getBinaryStream(s)){
  32.                         Geometry geo = getGeometryFromInputStream(inputStream);
  33.                         if(geo != null){
  34.                                 return geo.toString();
  35.                         }
  36.                 }catch(Exception e){
  37.                        
  38.                 }
  39.                 return null;
  40.         }

  41.         @Override
  42.         public String getNullableResult(ResultSet resultSet, int i){
  43.                 try(InputStream inputStream = resultSet.getBinaryStream(i)){
  44.                         Geometry geo = getGeometryFromInputStream(inputStream);
  45.                         if(geo != null){
  46.                                 return geo.toString();
  47.                         }
  48.                 }catch(Exception e){
  49.                        
  50.                 }
  51.                 return null;
  52.         }

  53.         @Override
  54.         public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
  55.                 return "";
  56.         }
  57.         /**
  58.          * 流 转 geometry
  59.          * */
  60.         private  Geometry getGeometryFromInputStream(InputStream inputStream) throws Exception {

  61.                 Geometry dbGeometry = null;

  62.                 if (inputStream != null) {
  63.                         // 二进制流转成字节数组
  64.                         byte[] buffer = new byte[255];

  65.                         int bytesRead = 0;
  66.                         ByteArrayOutputStream baos = new ByteArrayOutputStream();
  67.                         while ((bytesRead = inputStream.read(buffer)) != -1) {
  68.                                 baos.write(buffer, 0, bytesRead);
  69.                         }
  70.                         // 得到字节数组
  71.                         byte[] geometryAsBytes = baos.toByteArray();
  72.                         // 字节数组小于5 异常
  73.                         if (geometryAsBytes.length < 5) {
  74.                                 throw new PlatformAlertException("坐标异常");
  75.                         }

  76.                         //字节数组前4个字节表示srid 去掉
  77.                         byte[] sridBytes = new byte[4];
  78.                         System.arraycopy(geometryAsBytes, 0, sridBytes, 0, 4);
  79.                         boolean bigEndian = (geometryAsBytes[4] == 0x00);
  80.                         // 解析srid
  81.                         int srid = 0;
  82.                         if (bigEndian) {
  83.                                 for (int i = 0; i < sridBytes.length; i++) {
  84.                                         srid = (srid << 8) + (sridBytes[i] & 0xff);
  85.                                 }
  86.                         } else {
  87.                                 for (int i = 0; i < sridBytes.length; i++) {
  88.                                         srid += (sridBytes[i] & 0xff) << (8 * i);
  89.                                 }
  90.                         }

  91.                         WKBReader wkbReader = new WKBReader();
  92.                         // WKBReader 把字节数组转成geometry对象。
  93.                         byte[] wkb = new byte[geometryAsBytes.length - 4];
  94.                         System.arraycopy(geometryAsBytes, 4, wkb, 0, wkb.length);
  95.                         dbGeometry = wkbReader.read(wkb);
  96.                         dbGeometry.setSRID(srid);
  97.                 }
  98.                 return dbGeometry;
  99.         }
  100. }
  101. ————————————————
  102. 版权声明:本文为CSDN博主「s_hloo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  103. 原文链接:https://blog.csdn.net/s_hloo/article/details/111311022
复制代码






您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|JeeGit 官方论坛 ( 吉ICP备19001578号-2|吉B2-20200006 )

GMT+8, 2024-3-28 20:18 , Processed in 0.060342 second(s), 17 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表