示例:github地址
利用mybatis从postgresql中读取geometry类型字段到实体类中,可以多种接受方式:
1. 直接利用String去接受wkt
2. 利用mybatis在写入实体类时将wkt转换为geometry类型
第一种方式:非常简单粗暴,不过在代码中需要用到geometry类型时,都会写上如下代码:
try {
......
JtsUtils.createLineStringByWKT(wkt)
......
} catch (ParseException) {
e.printStackTrace();
}
如果代码中存在较多的地方用到几何运算相关的内容,这个在出现很多次。个人认为没有太大必要如此繁琐。当然几何运用的地方较少就当我没有说,直接跳过本文余下内容。
第二种方式:利用mybatis的自定义类型转换的功能,在写入实体时进行统一转换,同时在实体转换为数据库类型是将geometry类型转换为wkt字符串。
废话不多说,直接上代码:
AbstractGeometryTypeHandler.java 几何转换的父类
package com.threestone.common.mybatisTypeHandler;
import com.threestone.utils.JtsUtils;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.io.WKTReader;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 字符串转为JTS对应的几何类型
* Created by Friday on 2019/6/19.
*/
@MappedJdbcTypes({
JdbcType.OTHER})
public abstract class AbstractGeometryTypeHandler<T extends Geometry> extends BaseTypeHandler<T> {
/**
* 把Java类型参数转换为对应的数据库类型
*
* @param ps 当前的PreparedStatement对象
* @param i 当前参数位置
* @param parameter 当前参数的Java对象
* @param jdbcType 当前参数的数据库类型
* @throws SQLException
*/
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
String wkt = JtsUtils.toEwkt(parameter);
ps.setObject(i, wkt);
}
/**
* 获取数据结果集时把数据库类型转换为对应的Java类型
*
* @param rs 当前的结果集
* @param columnName 当前的字段名称
* @return 转换后的Java对象
* @throws SQLException
*/
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
String wkt = (String) rs.getObject(columnName);
return (T) getGeometryFromWkt(wkt);
}
/**
* 通过字段位置获取字段数据时把数据库类型转换为对应的Java类型
*
* @param rs 当前的结果集
* @param columnIndex 当前字段的位置
* @return 转换后的Java对象
* @throws SQLException
*/
public T