有个需求是经纬度坐标字符串通过 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方法。
因为调用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