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(); }