自定義typeHandler 處理oracle spatial 中的SDO_GEOMETRY字段

  • 數據庫表結構

image.png

  • 返回的bean對象
@Data
public class GroundWaterStageOrDepthIsourfaceDTO {

	/**
	 * 等值面id
	 */
	private String gizbdcd;

	/**
	 * 數值範圍
	 */
	private String shapeTp;
	
	/**
	 * shape 面
	 */
	private JGeometry shape;
	
  • 查詢輸出結果如下:

image.png
獲取的shape字段爲null。

  • 原因分析

無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,還是從結果集中取出一個值時,都會用類型處理器將獲取的值以合適的方式轉換成 Java 類型。這裏Mybatis不知道如何處理返回的shape字段,所以需要自定義TypeHandler。

  • 自定義TypeHandler

關於自定義TypeHandler,參考:
https://www.cnblogs.com/dongying/p/4040435.html
https://blog.csdn.net/zhaowenbo168/article/details/46943509

/**  
 * All rights Reserved, Designed By www.summit.com.cn
 */
package com.summit.gis.dxs.util.geo;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Struct;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;

import oracle.spatial.geometry.JGeometry;

/**   
 * @ClassName:  SdoGeometryTypeHandler   
 * @Description:SdoGeometry 類型轉換的實現   
 * @author: zhangcj
 * @date:   2019年9月28日 下午3:28:35   
 */
@MappedTypes({JGeometry.class})
@MappedJdbcTypes({JdbcType.STRUCT})
public class SdoGeometryTypeHandler implements TypeHandler<JGeometry> {

    @Override
    public void setParameter(PreparedStatement ps, int i, JGeometry parameter,
            JdbcType jdbcType) throws SQLException {
        Struct dbObject = null;
		try {
			dbObject = JGeometry.storeJS(ps.getConnection(),parameter);
		} catch (Exception e) {
			e.printStackTrace();
		}
        ps.setObject(i, dbObject);
    }

    @Override
    public JGeometry getResult(ResultSet rs, String columnName)
            throws SQLException {
    	Struct st = (Struct) rs.getObject(columnName);
        if (st != null) {
            return JGeometry.loadJS(st);
        }
        return null;
    }

    @Override
    public JGeometry getResult(ResultSet rs, int columnIndex)
            throws SQLException {
    	Struct st = (Struct) rs.getObject(columnIndex);
        if (st != null) {
            return JGeometry.loadJS(st);
        }
        return null;
    }

    @Override
    public JGeometry getResult(CallableStatement cs, int columnIndex)
            throws SQLException {
    	Struct st = (Struct) cs.getObject(columnIndex);
        if (st != null) {
            return JGeometry.loadJS(st);
        }
        return null;
    }
}

  • 在mybatis-config中配置自定義的TypeHandler
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 配置mybatis的緩存,延遲加載等等一系列屬性 -->
	<settings>
		<!-- 全局映射器啓用緩存 -->
		<setting name="cacheEnabled" value="false" />
		<!-- 查詢時,關閉關聯對象即時加載以提高性能 -->
		<setting name="lazyLoadingEnabled" value="false" />
		<!-- 設置關聯對象加載的形態,此處爲按需加載字段(加載字段由SQL指 定),不會加載關聯表的所有字段,以提高性能 -->
		<setting name="aggressiveLazyLoading" value="false" />
		<!-- 對於未知的SQL查詢,允許返回不同的結果集以達到通用的效果 -->
		<setting name="multipleResultSetsEnabled" value="true" />
		<!-- 允許使用列標籤代替列名 -->
		<setting name="useColumnLabel" value="true" />
		<!-- 允許使用自定義的主鍵值(比如由程序生成的UUID 32位編碼作爲鍵值),數據表的PK生成策略將被覆蓋 -->
		<!-- <setting name="useGeneratedKeys" value="true" /> -->
		<!-- 給予被嵌套的resultMap以字段-屬性的映射支持 -->
		<setting name="autoMappingBehavior" value="FULL" />
		<!-- 對於批量更新操作緩存SQL以提高性能 -->
		<setting name="defaultExecutorType" value="BATCH" />
		<!-- 數據庫超過25秒仍未響應則超時 -->
		<setting name="defaultStatementTimeout" value="120" />
		<!-- <setting name="logImpl" value="STDOUT_LOGGING" /> -->
	</settings>

	<!-- 映射JGeometry和SDO_GEOMETRY -->
	<typeHandlers>
		<typeHandler
			handler="com.summit.gis.dxs.util.geo.SdoGeometryTypeHandler"
			javaType="oracle.spatial.geometry.JGeometry" />
	</typeHandlers>
</configuration>
  • 測試返回數據

image.png
所需數據正確返回

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章