-4

嗨,我有代码 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){
        }

谢谢

4

2 回答 2

1

有两种可能的选择:

  1. 尝试使用Select语句检索记录,并在选择结果中插入零记录时仅插入。
  2. 在数据库表列上创建唯一键/索引并让插入触发。如果出现重复,插入将失败,但您需要处理异常(重复/唯一)。

如果可能,将这两个步骤一起应用,否则选择一个更适合您的其他业务场景的步骤。

于 2013-06-20T16:51:57.843 回答
0

我建议您永远不要Strings上构建查询。使用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());
}
于 2013-06-20T16:54:27.260 回答