【学习笔记-myabtis】使用mybtis对接pgsql的postgis插件,获取地理字段Geometry信息

使用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所有字段类型的父类

image-20230510162059801

抽象类如下

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、测试

成功获取到地理字段的数据参数,成功

image-20230512110322320

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xcong_Zhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值