嗨我有代码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){
}
谢谢
答案 0 :(得分:1)
有两种可能的选择:
如果可能,请同时应用这两个步骤,否则请选择其中一个更适合您的其他业务方案的步骤。
答案 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());
}