- 數據庫表結構
- 返回的bean對象
@Data
public class GroundWaterStageOrDepthIsourfaceDTO {
/**
* 等值面id
*/
private String gizbdcd;
/**
* 數值範圍
*/
private String shapeTp;
/**
* shape 面
*/
private JGeometry shape;
- 查詢輸出結果如下:
獲取的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>
- 測試返回數據
所需數據正確返回