JDBC中如何获取java.sql.Array的值

本文探讨了GIS项目中处理Oracle Spatial SDO_Geometry数据的挑战及解决方案,详细介绍了SDO_Geometry的组成部分,并演示了如何从数据库中提取并转换这些数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为最近在做GIS项目,中间涉及存取Oracle Spatial的SDO_Geometry信息,由于当初的设计原因,现在增加一个功能,要从库中取出地理信息的数据——这个功能可真是折腾人啊。。

我也是刚接触GIS不久,对于SDO_Geometry和JGeometry之间的转换并不熟悉,而且不会将其转换为字符串,于是就杯具了。

SDO_Geometry信息存储进数据库是分成这样的几个部分的:

   1、SDO_GTYPE :表示要存储的几何类型,如点线面。它是通过 NUMBER类型来表达的;

        2、SDO_SRID :几何的空间参考坐标系,类型也为 NUMBER;

        3、SDO_POINT :如果几何类型点类型的话,就是存储点坐标,否则为空。oracle自定义的SDO_POINT_TYPE类型;

        4、SDO_ELEM_INFO :定义要如何理解SDO_ORDINATES中的坐标串的;

        5、SDO_ORDINATES :存储实际坐标的,以X、Y以及不同点之间都是逗号隔开;

其中SDO_ELEM_INFO和SDO_ORDINATES都是sql.Array对象,而不是正常的java中的对象——这么说是不是不太专业⊙﹏⊙b汗

如何从sql.Array 中取值呢?

ResultSet rs=。。。。
java.sql.Array arr=rs.getArray(3);//假定第三列是Array类型的
Object obj=arr.getArray();//通过getArray方法,会返还一个Object对象
java.math.BigDecimal[] bd_Array=(java.math.BigDecimal)obj;//将obj强转为最终类型的数组

  这是IBM的帮助系统给的写法,学习一下——当然这需要前提是知道这个sql.Array中具体的数据类型,就这些。

转载于:https://my.oschina.net/tnjin/blog/625548

``` package jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Collection; /** * 修改数据 */ public class JDBCDemo9 { public static void main(String[] args) { try(Connection connection = DBUtil.getConnection();) { /** * JDBC中事物是自动提交的,意味着我们每执行一句DML语句,都会自动提交 * 如果我们需要自行控制事物,需要设置不自动提交 */ connection.setAutoCommit(false); String sql="UPDATE user "+ "SET password=? ,+nickname=? ,age=? "+ "WHERE id=? "; PreparedStatement ps= connection.prepareStatement(sql); ps.setString(1, "184754"); ps.setString(2, "小明"); ps.setInt(3, 18); ps.setInt(4, 3); int num=ps.executeUpdate(); System.out.println(num>0?"修改成功":"修改失败"); connection.commit(); System.out.println("修改成功!"); connection.rollback(); System.out.println("修改失败!,修改回滚!"); } catch (SQLException e) { e.printStackTrace(); } } }```"C:\Program Files\Java\jdk-17\bin\java.exe" "-javaagent:D:\IntelliJ IDEA 2024.3.4\lib\idea_rt.jar=55161" -Dfile.encoding=UTF-8 -classpath D:\java-student\JSD2502_SSM\JDBC\target\classes;C:\Users\2003q\.m2\repository\mysql\mysql-connector-java\8.0.15\mysql-connector-java-8.0.15.jar;C:\Users\2003q\.m2\repository\com\google\protobuf\protobuf-java\3.6.1\protobuf-java-3.6.1.jar;C:\Users\2003q\.m2\repository\com\alibaba\druid\1.1.21\druid-1.1.21.jar jdbc.JDBCDemo9 3月 26, 2025 9:20:49 上午 com.alibaba.druid.pool.DruidDataSource info 信息: {dataSource-1} inited java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '+nickname='小明' ,age=18 WHERE id=3' at line 1 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:970) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1109) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1057) at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1377) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1042) at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:255) at jdbc.JDBCDemo9.main(JDBCDemo9.java:28)
最新发布
03-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值