博客目录
前言
Oracle空间数据类型为 MDSYS.SDO_GEOMETRY 这里就不过多赘述关于此类型的相关信息,想要了解更多关于此类型数据可以点击这 : Oracle Spatial空间类型. 这篇博客的目的查询空间数据,映射到Java实体类,并对空间数据的经纬度进行打印。
问题分析
目前Oracle查询空间数据的方式由很多种
第一种 :Oracle函数:
//此sql 返回wkt数据信息
SELECT SDO_GEOMETRY.GET_WKT(THE_GEOM) FROM GIST_SHUIWEI;
//此sql 返回wkb二进制信息
SELECT SDO_GEOMETRY.GET_WKB(THE_GEOM) FROM GIST_SHUIWEI;
//此sql 返回gml数据
select SDO_UTIL.TO_GMLGEOMETRY(THE_GEOM) from GIST_SHUIWEI;
虽然以上三种方式都能得到空间数据,但是解析起来难度教高。
第二种 :采用Oracle SAO API 将数据库空间类型转为 JGeometry类型
目前我采用的是这种方式 但是!!!最后我发现有更简单的方式。
这个方式需要使用的Oracle的sao api类库,个人亲测在pom中引入这个jar包的依赖,并不能使用,可能这个类库年代久远吧,需要jar的可以加我v lyf1208087904
代码实现
Demo 采用的是springboot+mybatis+jdbc+Oracle
引入依赖
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--saoapi-->
<dependency>
<groupId>toosl</groupId>
<artifactId>test</artifactId>
<version>1</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/sdoapi-1.0.jar</systemPath>
</dependency>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Oracle+mybatis-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
数据源配置
spring:
datasource:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@192.164.2.51:1521:oracle
username:
password:
name: datasource
导入jar包
jar包放在resources目录下,新建lib目录,加进去,然后再pom中添加引入依赖
groupId可以瞎写
artifactId可以瞎写
version可以瞎写
其他两个跟我一样就可以
<dependency>
<groupId>toosl</groupId>
<artifactId>test</artifactId>
<version>1</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/resources/lib/sdoapi-1.0.jar</systemPath>
</dependency>
实体类
DemoModo.class
@Data //这个注解是lombok插件,代替set get方法的,如果想使用此插件再pom中引入依赖就可以了
/**
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
*/
public class spatialData {
private JGeometry shape;
}
Dao与数据库连接层
DemoDao.interface
@Repository
public interface DemoDao{
/**
* 查询所有点的经纬度
* @return
*/
List<spatialData> selectLatAndLon(String tableName);
}
Dao实现类
DemoDaoImpl .class
@Repository
public class DemoDaoImpl implements DemoDao
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List<DemoModo> selectLatAndLon(String tableName) {
StringBuffer s = new StringBuffer("select THE_GEOM from ");
StringBuffer sql = s.append(tableName);
//下边是Java新特性 拉姆达表达式
return jdbcTemplate.query(sql.toString(), (rs,rowNum) -> {
spatialData r = new spatialData();
r.setShape(JGeometry.load((STRUCT)rs.getObject("THE_GEOM")));
return r;
});
}
}
service 接口
DemoService
public interface DemoService {
/**
* @param
* @Author: Unen_
* @Date: 2020/6/12 15:55
*/
void selectSpatialData();
}
service 实现类
@Service
public class OracleServiceImpl implements OracleService {
@Autowired
DemoDao demoDao;
/**
* 功能描述: 查询空间数据的经纬度
* @param
* @return: a
* @Athor: Unen_
* @Date: 2020/6/12 15:44
*/
@Override
public void selectSpatialData() {
List<DemoModo> list = oracleMapperImple.selectLatAndLon("GIST_SHUIWEI");
for (spatialData data : list) {
JGeometry geometry = data.getShape();
Point2D point = geometry.getJavaPoint();
//这里就是经纬度信息
System.out.println(point.getX()+"--"+point.getY());
}
}
}
Controller层
DemoController
@RestController
public class OracleController {
@Autowired
DemoService demoService ;
@RequestMapping("spatialData")
public String SpatialData(){
demoService.selectSpatialData();
return "selectSpatialData!";
}
查询结果
解决方式二
上面有说到还有一种最简单的映射方式,我相信没有人不会的:
select c.THE_GEOM.SDO_POINT.X AS X, c.THE_GEOM.SDO_POINT.Y AS Y from GIST_SHUIWEI c;
查询结果
用mybatis查询定义一个list接收,或者定义一个实体类 有x 和 y字段 接收,都非常简单!!!
总结
解决问题的方式有很多种,选择很重要,写这个博客只为了记录当下解决问题的思路,如果能帮助到你那就更好了,希望不要搬运,谢谢。