ebean pgsql geometry类型与java PGgeometry类型mapping

jar包
implementation("net.postgis:postgis-jdbc:2.5.0")
说明一下:
    ebean这个orm框架比较小众,网上的资料也比较少,所有写了这篇文章供有需要的朋友参考一下。
    
    先自定义GeoScalarType类继承ScalarTypeBase。主要重写两个方法,一个是bind,一个是read方法。bind中sqlType用的是Types.OTHER,非Types中类型后面会报错,Types中又没有pg的空间坐标类型。

    然后利用java的spi机制加载GeoExtraTypeFactory类,注册GeoScalarType类。

需求是从excel导入数据保存到数据库中,代码如下:   
import io.ebean.config.DatabaseConfig;
import io.ebean.core.type.ExtraTypeFactory;
import io.ebean.core.type.ScalarType;

import java.util.ArrayList;
import java.util.List;

public class GeoExtraTypeFactory implements ExtraTypeFactory {

    @Override
    public List<? extends ScalarType<?>> createTypes(DatabaseConfig config, Object objectMapper) {
        List<ScalarType<?>> result = new ArrayList<>();
        result.add(new GeoScalarType());
        return result;
    }
}
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import io.ebean.config.dbplatform.DbPlatformType;
import io.ebean.core.type.DataBinder;
import io.ebean.core.type.DataReader;
import io.ebean.core.type.DocPropertyType;
import io.ebean.core.type.ScalarTypeBase;
import org.postgis.PGgeometry;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Types;

public class GeoScalarType extends ScalarTypeBase<PGgeometry> {

    public GeoScalarType() {
        super(PGgeometry.class, true, DbPlatformType.POLYGON);
    }

    @Override
    public void bind(DataBinder binder, PGgeometry value) throws SQLException {
        if (value == null) {
            binder.setNull(Types.NULL);
        } else {
            binder.setObject(value, Types.OTHER);
        }
    }

    @Override
    public PGgeometry read(DataReader reader) throws SQLException {
        Object object = reader.getObject();
        return (PGgeometry) object;
    }

    @Override
    public PGgeometry readData(DataInput dataInput) throws IOException {
        return null;
    }

    @Override
    public void writeData(DataOutput dataOutput, PGgeometry value) throws IOException {
    }

    @Override
    public long asVersion(PGgeometry value) {
        return value.hashCode();
    }

    @Override
    public Object toJdbcType(Object value) {
        return value;
    }

    @Override
    public PGgeometry toBeanType(Object value) {
        return null;
    }

    @Override
    public String format(Object value) {
        return String.valueOf(value);
    }

    @Override
    public String formatValue(PGgeometry v) {
        return v.getValue();
    }

    @Override
    public PGgeometry parse(String value) {
        try {
            return new PGgeometry(value);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public PGgeometry jsonRead(JsonParser parser) throws IOException {
        return null;
    }

    @Override
    public void jsonWrite(JsonGenerator writer, PGgeometry value) throws IOException {
        writer.writeString(value.getValue());
    }

    @Override
    public DocPropertyType docType() {
        return DocPropertyType.OBJECT;
    }
}
import com.alibaba.excel.annotation.ExcelProperty;
import com.idataway.pro.entity.finder.RegionGeoFinder;
import com.idataway.pro.index.GeoConverter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import org.postgis.PGgeometry;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDateTime;
import java.util.UUID;

@Data
@Entity
@Accessors(chain = false)
@Table(name = "t_region_geo")
@FieldNameConstants
public class RegionGeo {
    public static final RegionGeoFinder FINDER = new RegionGeoFinder();

    @Id
    private UUID id;

    @Schema(description = "序号")
    @ExcelProperty(index = 0)
    private int num;

    @Schema(description = "所属行政区")
    @ExcelProperty(index = 1)
    private String region;

    @Schema(description = "所属行政区-子区")
    @ExcelProperty(index = 2)
    private String subRegion;

    @Schema(description = "geo")
    @ExcelProperty(index = 3, converter = GeoConverter.class)
    private PGgeometry geo;

    private Integer isDelete;

    private LocalDateTime createTime;

    private LocalDateTime updateTime;

}
public void geoImport(MultipartFile file) throws IOException {
    RegionGeo.FINDER.deleteAll();
    EasyExcelFactory.read(file.getInputStream(), RegionGeo.class, new PageReadListener<RegionGeo>(dataList -> {
        for (RegionGeo regionGeo : dataList) {
            regionGeo.setIsDelete(0);
            regionGeo.setCreateTime(LocalDateTime.now());
            regionGeo.setUpdateTime(regionGeo.getCreateTime());
        }
        DB.insertAll(dataList);
    })).headRowNumber(1).excelType(ExcelTypeEnum.CSV).charset(Charset.forName("gbk")).sheet(0).doRead();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值