Mybatis-plus通过TypeHandler实现wkt字符串类型和数据库GEOMETRY类型自动转换
步骤一:导入依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>net.postgis</groupId> <artifactId>postgis-jdbc</artifactId> <version>2021.1.0</version> </dependency> 复制代码
步骤二:创建handle类
import cn.hutool.core.util.ObjectUtil; import net.postgis.jdbc.PGgeometry; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import org.springframework.stereotype.Component; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Optional; @Component public class WKTGeoJsonTypeHandler implements TypeHandler<Object> { /** * 设置参数(用于类型转换操作) * @param preparedStatement * @param i * @param o * @param jdbcType * @throws SQLException */ @Override public void setParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException { //将wkt类型字符串转换为postgis类型PGgeometry用来实现自动入库 //注意 wkt的类型必须为大写 类如(point 必须为:POINT) if(ObjectUtil.isNotNull(o)){ String wkt=o.toString(); PGgeometry pGgeometry =new PGgeometry(wkt); preparedStatement.setObject(i,pGgeometry); } } /** * 将结果转为wkt格式 * @param resultSet * @param columnName * @return * @throws SQLException */ @Override public Object getResult(ResultSet resultSet, String columnName) throws SQLException { Object object = Optional.ofNullable(resultSet.getObject(columnName)).orElseGet(Object::new); if (object instanceof PGgeometry){ return ((PGgeometry)object).getValue(); } return object; } @Override public Object getResult(ResultSet resultSet, int i) throws SQLException { return null; } @Override public Object getResult(CallableStatement callableStatement, int i) throws SQLException { return null; } } 复制代码
步骤三:对字段设置该handle
@Data @TableName(value = "address") @Builder public class Address implements Serializable { @TableId(value = "uuid", type = IdType.INPUT) private String uuid; @TableField(value = "adderss") private String adderss; @TableField(value = "geom",typeHandler = WKTGeoJsonTypeHandler.class) private Object geom; } 复制代码
步骤四:测试
@Test void select() throws Exception { List<Address> list = addressService.list(); list.forEach(s-> System.out.println(s.toString())); } @Test public void add() throws SQLException { Address test = Address.builder().uuid("1111112").adderss("test").geom("POINT(0 0)").build(); addressService.save(test); } 复制代码
注意:service mapper 通过插件自动生成
其他:XML写法
以上就完成了postgis数据自动入库和查询,是不是很秀,该块去尝试吧!!!
作者:一瓶子不满半瓶子晃荡
链接:https://juejin.cn/post/7168760625190371364
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。