【问题标题】:INSERT SQL in Java在 Java 中插入 SQL
【发布时间】:2010-05-27 12:36:52
【问题描述】:

我有一个 Java 应用程序,我想使用 SQL 数据库。我有一个连接类:


public class SQLConnection{
    private static String url = "jdbc:postgresql://localhost:5432/table";
    private static String user = "postgres";
    private static String passwd = "toto";
    private static Connection connect;
    public static Connection getInstance(){
        if(connect == null){
            try {
                connect = DriverManager.getConnection(url, user, passwd);
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Connection Error", JOptionPane.ERROR_MESSAGE);
            }
        }       
        return connect; 
    }
}

现在,在另一个类中,我成功打印了我的值,但是当我尝试插入一个值时,什么都没有发生......

这是我的代码:


try {
Statement state = SQLConnection.getInstance().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
Statement state2 = SQLConnection.getInstance().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
state2.executeUpdate("INSERT INTO table(field1) VALUES (\"Value\")"); // Here's my problem
ResultSet res = state.executeQuery("SELECT * FROM table");

【问题讨论】:

  • 我想知道您为什么以及如何将其标记为 prepared-statement 而您根本没有在代码中使用它(您应该但是这样做)。

标签: java sql jdbc prepared-statement


【解决方案1】:

使用后需要commit(和close)连接(和声明)。您还需要确保您没有吞下任何 SQLExceptions,这可能会导致您看到“什么都没有”发生。


也就是说,

private static Connection connect;

这是一个非常糟糕的主意。你不应该在你的应用程序中将 external 资源声明为static。当对方决定关闭资源时,您的应用程序将中断,因为它已被释放了太长时间。您确实需要关闭这些资源(ConnectionStatementResultSet最短范围内。即在与 where 完全相同的方法块内查询将被执行。

另外,我强烈建议使用PreparedStatement 而不是Statement,因为这会阻止您的代码使用SQL injection attacks

您可能会发现this article 有助于了解更多有关如何以正确方式进行基本 JDBC 交互的信息。

【讨论】:

  • 默认开启自动提交。除非您覆盖它,否则无需进行提交调用。关闭也不是绝对必要的(因为它最终会自行关闭),但这是一种最佳做法。
  • @Brian:在我做 JDBC 的这些年里,我了解到只有 2 个可能的原因导致查询没有被执行。 1) 未提交连接。 2) 吞下异常。 OP 可能没有在问题中发布所有必要的信息(另请参阅其他答案,它们是基于 OP 的错误信息)。
【解决方案2】:
state2.executeUpdate("INSERT INTO table(field1) VALUES (\"Value\")");

应该是:

state2.executeUpdate("INSERT INTO plateau(field1) VALUES (\"Value\")");

【讨论】:

  • 是的,抱歉,我只是为 stackoverflow 修改了我的代码。错误不是那个;)(我编辑了我的代码)
【解决方案3】:

Copuld 只是复制到 SO 错误,但看起来但应该 INSERT INTO table(field1) 是 INSERT INTO高原(field1)?

【讨论】:

  • 是的,抱歉,我只是为 stackoverflow 修改了我的代码。错误不是那个;)(我编辑了我的代码)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 2018-03-20
相关资源
最近更新 更多