mybatis 映射oracle spatial JGeometry 类型并调用存储过程。

本文介绍了如何在Java应用中使用MyBatis处理Oracle数据库中包含Spatial特性JGeometry类型的字段。首先,引入了sdoapi.jar等四个Oracle库的jar包。接着,为MyBatis实现自定义TypeHandler以处理STRUCT类型。注意,当使用特定连接池时,可能需要检查并拆包连接以获取OracleConnection。然后配置mybatis-config.xml文件,定义调用存储过程的接口和参数。最后,展示了通过jdbc直接调用处理geometry相关存储过程的方法。
摘要由CSDN通过智能技术生成
有个需求是经纬度坐标字符串通过 http请求,后台调用一个 oracle存储过程.

因为调用oracle库,并且需要用到spatial特性的geometry类型的字段,所以就用了oracle自己的类库。
oracle.spatial.geometry.JGeometry。

我这里涉及到4个jar包。
sdoapi.jar
sdotopo.jar
sdoutl.jar
sdonm.jar

jar包一般需要从oracle官网下载,如果有服务器端,一般 在${ORACLE_HOME}md/jlib 目录可以找到。

如果mybatis 想要映射到JGeometry类型,需要将设置类型成STRUCT.
必须实现mybatis提供的接口。参考下面的博客。
http://blog.csdn.net/zhaowenbo168/article/details/46943509

上面博客中有个问题,就是如果你用到某些连接池,mybatis调用 TypeHandler的时候,包装的连接不能强制转成 OracleConnection ,需要判断连接池中的连接是否是OracleConnection的包装,如果是需要拆包,然后利用原始连接构造STRUCT对象。看下面代码setParameter方法。

import java.sql.*;

import oracle.jdbc.driver.OracleConnection;
import oracle.spatial.geometry.JGeometry;
import oracle.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;

@MappedTypes({JGeometry.class})
@MappedJdbcTypes({JdbcType.STRUCT})//这两个Mapped也可不需要
public class SdoGeometryTypeHandler implements TypeHandler<JGeometry> {

@Override
public void setParameter(PreparedStatement ps, int i, JGeometry parameter,
JdbcType jdbcType) throws SQLException {
// TODO Auto-generated method stub
Connection conn = ps.getConnection();
OracleConnection oracleConnection= null;
if(conn.isWrapperFor(OracleConnection.class)){
oracleConnection = conn.unwrap(OracleConnection.class);
STRUCT dbObject = JGeometry.store(parameter, oracleConnection);
ps.setObject(i, dbObject);
}
else{
STRUCT dbObject = JGeometry.store(parameter, conn);
ps.setObject(i, dbObject);
}

}

@Override
pu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值