报错信息
Type handler was null on parameter mapping for property ‘coordinates’。It was either not specified and/or could not be found for the javaType (org.postgresql.geometric.PGpoint) : jdbcType (null) combination.
项目技术栈:
springboot+mybatis+pgsql
需求:
将Java实体类中的空间几何类型数据(点,线,多边形,多面体)与pgsql中的point,line 等类型做一个关系映射,针对一般的数据类型mybatis已经为我们做好这件事了,比如我们再Java中定义的String类型你不用关系是如何映射到mysql中的char类型的,但是mybatis没有做空间几何数据类型的映射处理,所以我需要自定义一个类型处理器TypeHandler来做这一层映射。
网上查了大多是对json类型的映射,也有很多按自定义数据格式经typehandler处理之后再存库的,思路都是差不多的,我比葫芦画瓢写了一个针对坐标 Point类型数据处理的,经验证是可行的,给大家一些参考;
自定义TypeHandler
package io
.closed
.common
.handler
;
import lombok
.extern
.slf4j
.Slf4j
;
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
.locationtech
.jts
.geom
.Geometry
;
import org
.locationtech
.jts
.geom
.Point
;
import org
.locationtech
.jts
.io
.WKTReader
;
import org
.postgresql
.geometric
.PGpoint
;
import org
.postgresql
.util
.PGobject
;
import java
.sql
.CallableStatement
;
import java
.sql
.PreparedStatement
;
import java
.sql
.ResultSet
;
import java
.sql
.SQLException
;
@Slf4j
@MappedTypes(value
= {PGpoint
.class})
public class GeometryTypeHandler extends BaseTypeHandler<PGpoint> {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement
, int i
, PGpoint pGpoint
, JdbcType jdbcType
) throws SQLException
{
pGpoint
.setType("point");
preparedStatement
.setObject(i
,pGpoint
);
}
@Override
public PGpoint
getNullableResult(ResultSet resultSet
, String s
) throws SQLException
{
return (PGpoint
) resultSet
.getObject(s
);
}
@Override
public PGpoint
getNullableResult(ResultSet resultSet
, int i
) throws SQLException
{
return (PGpoint
) resultSet
.getObject(i
);
}
@Override
public PGpoint
getNullableResult(CallableStatement callableStatement
, int i
) throws SQLException
{
return (PGpoint
) callableStatement
.getObject(i
);
}
}
mybatis配置
把包地址配上 :在configuration中配置type-handlers-package属性
type-handlers-package: io.closed.common.handler
重点关注我标蓝色的即可
Mapper.xml文件
在需要映射的字段上加上自定义typehandler