我执行程序时重复插入

时间:2013-06-20 16:34:11

标签: java

嗨我有代码java swing在表sql中插入2行 我在表2中插入了我在框架中设置的jtextfields 所以如果我在jTextfields

中设置相同的文本,我想不要插入行

这是代码:

Connection conn = null;
     Statement stmt = null;
    try{
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+db, "root", "123456");
stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO router(hostname,address,version)VALUES('Edge 01','"+jTextField1.getText()+"','2700')" )  ;
stmt.executeUpdate("INSERT INTO router(hostname,address,version) VALUES('Edge 02','"+jTextField2.getText()+"','2700)" )  ;
stmt.close();
conn.close();

    }
        catch(SQLException ek){
        }

谢谢

2 个答案:

答案 0 :(得分:1)

有两种可能的选择:

  1. 尝试使用select语句检索记录,并仅在选择结果为ZERO记录时插入。
  2. 在数据库表列上创建唯一键/索引,然后触发插入。如果重复,插入将失败,但您需要处理异常(重复/唯一)。
  3. 如果可能,请同时应用这两个步骤,否则请选择其中一个更适合您的其他业务方案的步骤。

答案 1 :(得分:0)

我建议您从不永远,在String处构建查询。使用PreparedStatement

现在,开始了。您需要首先查询数据库,看它是否包含所需的值,如果它没有插入它。

为清楚起见,将此逻辑移至单独的方法中。并始终关闭finally块中的资源,否则如果存在Exception则会出现内存泄漏。我使用了Java 7 try-with-resources构造。

public boolean insertIfNotPresent(final Connection con, final String value) throws SQLException {
    final String checkQuery = "SELECT COUNT(*) FROM router where hostname='Edge 01' and version=2700 and address=?";
    try (final PreparedStatement statement = con.prepareStatement(checkQuery)) {
        statement.setString(1, value);
        try (final ResultSet resultSet = statement.executeQuery()) {
            if (resultSet.next() && resultSet.getInt(1) > 0) {
                return false;
            }
        }
    }
    final String insertQuery = "INSERT INTO router SET hostname='Edge 01', version=2700, address=?";
    try (final PreparedStatement statement = con.prepareStatement(insertQuery)) {
        statement.setString(1, value);
        statement.executeUpdate();
    }
    return true;
}

因此,第一个查询SELECT COUNT(*) ...计算符合条件的行。如果数据库中已存在某些内容,则返回false

如果我们没有从第一部分返回false,则第二个查询执行插入。在这种情况下,该方法返回true

作为上述代码中的一个示例,以下内容可以正常工作

try(final Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+db, "root", "123456")) {
    insertIfNotPresent(conn, jTextField1.getText());
    insertIfNotPresent(conn, jTextField2.getText());
}