Java JDBC insert查询不在oracle数据库中插入记录

Java JDBC insert查询不在oracle数据库中插入记录,java,jdbc,oracle11g,oracle-spatial,Java,Jdbc,Oracle11g,Oracle Spatial,我已经成功地建立了数据库连接,但是当我通过Java运行这段代码时,我的代码一直在运行,什么也没有发生。 并没有什么意味着它既并没有插入到数据库中,也并没有给我任何异常 我使用的是Oracle11g中的空间数据类型(MDSYS.SDO_POINT_TYPE)。我直接在Oracle11g数据库中运行了这个查询,它运行得很好,但在通过java代码使用它时,不知何故没有插入记录 我还尝试使用一个简单的student表,并能够使用java插入语句 以下是我的片段: String insert = "ins

我已经成功地建立了数据库连接,但是当我通过Java运行这段代码时,我的代码一直在运行,什么也没有发生。 并没有什么意味着它既并没有插入到数据库中,也并没有给我任何异常

我使用的是Oracle11g中的空间数据类型(MDSYS.SDO_POINT_TYPE)。我直接在Oracle11g数据库中运行了这个查询,它运行得很好,但在通过java代码使用它时,不知何故没有插入记录

我还尝试使用一个简单的student表,并能够使用java插入语句

以下是我的片段:

String insert = "insert into table1 values('p0', MDSYS.SDO_POINT_TYPE(228,102, null))";
    try
    {
        Statement statement = connection.createStatement();
        statement.executeUpdate(insert);
        System.out.println("Inserted record in the table");
    }catch(SQLException e)
    {
        System.out.println("Error due to SQL Exception");
        e.printStackTrace();
    }
    try
    {

        connection.close();
        System.out.println("Closing the connection");
    }catch(SQLException e)
    {
        System.out.println("Error in closing connection");
        e.printStackTrace();
    }
JDBC的连接是:

try {
        Class.forName("oracle.jdbc.driver.OracleDriver");

    } catch (ClassNotFoundException e) {
        System.out.println("Where is your Oracle JDBC Driver?");
        e.printStackTrace();
    }
    System.out.println("Oracle JDBC Driver Registered!");

    Connection connection = null;

    try {

        connection = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:db11g", username,
                pass);


    } catch (SQLException e) {
        System.out.println("Connection Failed!");
        e.printStackTrace();
    }
    if (connection != null) {
        System.out.println("Database connected");
    } else {
        System.out.println("Failed to connect the database");
    }
    return connection;

除非您的连接处于自动提交模式*,否则您应该在调用
close()
之前调用它:

强烈建议应用程序在调用close方法之前显式提交或回滚活动事务。如果调用close方法并且存在活动事务,则结果由实现定义

看起来Oracle的行为是回滚事务。以下是解决此问题的方法:

try
{
    Statement statement = connection.createStatement();
    statement.executeUpdate(insert);
    connection.commit(); // <====== Here
    System.out.println("Inserted record in the table");
}catch(SQLException e)
{
    System.out.println("Error due to SQL Exception");
    e.printStackTrace();
}
用实际列的名称替换
col1
col2
。还要考虑参数化插入,并使用<代码> PravaRealds< /C> > /P>

*这很少被推荐。

我看到您已经修复了代码以正确提交,现在它可以正常工作了

但我想指出,你所做的毫无意义。SDO_POINT_类型不应该像您那样使用:它只应该在SDO_GEOMETRY类型中使用:这是您必须使用的真正的空间类型:索引它、查询它、在各种过程中使用它(如从它生成缓冲区)等等

因此,如果您打算使用Oracle Spatial:

1) 在表中,使用SDO_几何图形类型。例如:

create table us_cities (
   state char(2),
   name char(50),
   location sdo_geometry,
   primary key (state, name)
);
2) 要手动插入行,请执行以下操作:

insert into us_cities (state, name, location) 
values (
  'CA',
  'Los Angeles',
  sdo_geometry (2001, 4326, sdo_point_type (-118.411201,34.112101,null),null,null)
);
NAME                 STATE
-------------------- -----
Philadelphia         PA
Allentown            PA
Elizabeth            NJ
Newark               NJ
Jersey City          NJ
Paterson             NJ
Yonkers              NY
Stamford             CT
Bridgeport           CT
New Haven            CT
Waterbury            CT
Hartford             CT
Springfield          MA

13 rows selected.
在现实生活中,您显然会使用绑定变量作为坐标。或者,由于您使用java, 使用Oracle Spatial的java API,可以在java中操作几何图形

3) 设置该表的空间元数据

insert into user_sdo_geom_metadata (table_name, column_name, diminfo, srid) 
values (
  'US_CITIES', 
  'LOCATION', 
  sdo_dim_array (
    sdo_dim_element('Long', -180, 180, 1), 
    sdo_dim_element('Lat', -90, 90, 1)  
  ), 
  4326 
); 
commit;
4) 创建空间索引

create index us_cities_sx on us_cities
  indextype is mdsys.spatial_index;
5) 现在执行一些查询(假设表中已填写了一些美国城市的位置)

这可能会返回如下结果:

insert into us_cities (state, name, location) 
values (
  'CA',
  'Los Angeles',
  sdo_geometry (2001, 4326, sdo_point_type (-118.411201,34.112101,null),null,null)
);
NAME                 STATE
-------------------- -----
Philadelphia         PA
Allentown            PA
Elizabeth            NJ
Newark               NJ
Jersey City          NJ
Paterson             NJ
Yonkers              NY
Stamford             CT
Bridgeport           CT
New Haven            CT
Waterbury            CT
Hartford             CT
Springfield          MA

13 rows selected.

此时,您真的应该在Oracle文档中阅读更多有关Oracle Spatial的信息。

能否先在DB中运行相同的Insert查询,看看它是否有效?通过这种方式,您将知道您的查询或java代码是否有问题,然后找到解决方案。是的,当我直接插入数据库时,它可以工作连接设置如何?你必须调用commit才能让它站稳脚跟吗?好的,那是Java代码。请通过@dasblinkenlight检查下面的答案,看起来你错过了commit();我已经在上面添加了我的连接代码。我尝试了连接。提交();但它的行为仍然是一样的。不走运!!同意,提交()确实!!我只是删除了表,再次创建并运行了代码。成功了。但我添加了提交,在关闭连接之前进行提交是安全的。感谢JDBC现在需要在连接关闭时回滚,在过去,Oracle驱动程序实际上是在连接关闭时提交的少数驱动程序之一。