使用mybtis对接pgsql的postgis插件,获取地理字段geometry信息
参考资料:
Mybatis 自定义TypeHandler - 邓维-java - 博客园
1、如何使用typehandler
相信大家用Mybatis这个框架至少一年以上了吧,有没有思考过这样一个问题:数据库有自己的数据类型,Java有自己的数据类型,那么Mybatis是如何把数据库中的类型和Java的数据类型对应的呢?本篇文章就来讲讲Mybatis中的 黑匣子TypeHandler(类型处理器) 。
顾名思义,类型处理器,将入参和结果转换为所需要的类型,Mybatis中对于内置了许多类型处理器,实际开发中已经足够使用了。
- 要对接我们的地理字段geometry,就需要使用我们的typeHadnler
2、typehandler源码
类型处理器这个接口其实很简单,总共四个方法,一个方法将入参的Java类型的数 据转换为JDBC类型,三个方法将返回结果转换为Java类型。源码如下:
public interface TypeHandler<T> {
//设置参数,java类型转换为jdbc类型
void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
//将查询的结果转换为java类型
T getResult(ResultSet rs, String columnName) throws SQLException;
T getResult(ResultSet rs, int columnIndex) throws SQLException;
T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}
3、配置信息如下
#mp配置
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1 #逻辑已删除值(默认为 1)
logic-not-delete-value: 0 #逻辑未删除值(默认为 0)
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #启动 mybatis 本身的 log 日志
map-underscore-to-camel-case: true #启用驼峰命名
mapper-locations: classpath*:/mapper/*.xml #mapper扫描规则
type-handlers-package: com.huicoo.mybatisPlus.typehandler #指定TypeHandler所在包的扫描规则
type-handlers-package
,指定TypeHandler所在包的扫描规则,指定后mybatis会扫描对应路径下的typeHandler
4、 代码
代码的结构如下,一个抽象类作为postgis所有字段类型的父类
抽象类如下
package com.huicoo.forestry.mybatis.typehandler;
/**
* @Author zhuhuacong
* @Date: 2023/05/10/ 11:21
* @description
*/
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgis.Geometry;
import org.postgis.PGgeometry;
public abstract class GeometryTypeHandler<T extends Geometry> extends BaseTypeHandler<T> {
public GeometryTypeHandler() {
}
public void setNonNullParameter(PreparedStatement preparedStatement, int i, T t, JdbcType jdbcType) throws SQLException {
PGgeometry geometry = new PGgeometry();
geometry.setGeometry(t);
preparedStatement.setObject(i, geometry);
}
public T getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
PGgeometry pGgeometry = (PGgeometry)resultSet.getObject(columnName);
return pGgeometry == null ? null : (T) pGgeometry.getGeometry();
}
public T getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
PGgeometry pGgeometry = (PGgeometry)resultSet.getObject(columnIndex);
return pGgeometry == null ? null : (T) pGgeometry.getGeometry();
}
public T getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
PGgeometry pGgeometry = (PGgeometry)callableStatement.getObject(columnIndex);
return pGgeometry == null ? null : (T) pGgeometry.getGeometry();
}
}
geometry字段的子类如下
/**
* @Author zhuhuacong
* @Date: 2023/05/10/ 11:19
* @description
*/
import org.apache.ibatis.type.MappedTypes;
import org.postgis.Geometry;
@MappedTypes({Geometry.class})
public class GeometryStringTypeHandler extends GeometryTypeHandler<Geometry> {
public GeometryStringTypeHandler() {
}
}
5、测试
成功获取到地理字段的数据参数,成功