如何从Java向MySql发送参数化删除
我想通过以下方式从名为如何从Java向MySql发送参数化删除,java,mysql,sql,Java,Mysql,Sql,我想通过以下方式从名为PersonnelTable的表中删除: public void verifyDetailsBeforeClosingAccount(String _idNumber,String _username,String _password ,String _account) { String retrievedNumberAccount = null; String retrievedOwnerIdnumber = null; try {
PersonnelTable
的表中删除:
public void verifyDetailsBeforeClosingAccount(String _idNumber,String _username,String _password ,String _account)
{
String retrievedNumberAccount = null;
String retrievedOwnerIdnumber = null;
try
{
// take all the rows with "account-number" and "id-numbder" in the "Checking-account-table"
ResultSet results = this.m_statement.executeQuery("SELECT `AccountNumber`, `IdNumber` FROM `CheckingAccountsTable`");
while (results.next() == true)
{
retrievedNumberAccount = results.getString("AccountNumber"); // take the account number
retrievedOwnerIdnumber = results.getString("IdNumber"); // take the ID number
if (retrievedNumberAccount.equals(_account) == true && retrievedOwnerIdnumber.equals(_idNumber) == true ) // found a partial match
{
// put something here
}
}
}
}
我想删除PersonnelTable
中的一行,其中:
Password
列等于给定给函数的\u Password
this.m_statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = _password AND `UserName` =_username ");
我看过DELETE
的教程,但没有介绍如何在函数中处理给定值。我怎样才能解决这个问题
因为它是一个字符串,所以用单引号将值括起来。对吧?
this.m_statement.executeQuery("DELETE FROM `PersonnelTable`
WHERE `Password` = '" + _password + "' AND
`UserName` = '" + _username + "' ");
这样做更好
前
用单引号将值括起来,因为它是一个字符串。对吧?
this.m_statement.executeQuery("DELETE FROM `PersonnelTable`
WHERE `Password` = '" + _password + "' AND
`UserName` = '" + _username + "' ");
这样做更好
前
您要做的是删除用户名为“\u username”的记录(不是传递给您的值,而是字面上的“\u username”) 你必须: a) 传递值而不是变量的名称:
statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = `" + _password + "` AND `UserName` = `" + _username + "` ");
b) 使用PreparedStatement(建议避免SQL注入攻击)
编辑:另一方面,如果用户名是注册表的密钥(唯一标识符),则添加密码检查只会减慢操作速度,使过程复杂化(如果有人同时更改密码怎么办?),并且不会给您带来任何好处。您要做的是删除用户名为“\u username”的记录(不是传递给您的值,而是字面上的“_username”) 你必须: a) 传递值而不是变量的名称:
statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = `" + _password + "` AND `UserName` = `" + _username + "` ");
b) 使用PreparedStatement(建议避免SQL注入攻击)
编辑:另一方面,如果用户名是注册表的一个键(唯一标识符),则添加密码检查只会减慢操作速度,使过程复杂(如果有人同时更改密码怎么办?),并且不会给您带来任何好处。您需要使用准备好的语句并将值作为参数传递
String deleteString = "DELETE FROM `PersonnelTable` WHERE `Password` = ? AND `UserName` = ? ";
PreparedStatement deleteStmt = con.prepareStatement(deleteString);
deleteStmt.setString(1, _password); // Use whatever the object type of user/password are
deleteStmt.setString(2, _username);
deleteStmt.executeUpdate();
con.commit();
您需要使用准备好的语句并将值作为参数传递
String deleteString = "DELETE FROM `PersonnelTable` WHERE `Password` = ? AND `UserName` = ? ";
PreparedStatement deleteStmt = con.prepareStatement(deleteString);
deleteStmt.setString(1, _password); // Use whatever the object type of user/password are
deleteStmt.setString(2, _username);
deleteStmt.executeUpdate();
con.commit();
您正在将文本值_password和_username发送到SQL中;相反,您需要在变量中传递值。我建议这样做作为参数。我的JDBC是超级生锈的,所以现在您可以将其作为“适当的代码示例”存根
this.m_statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = '" + _password + "' AND `UserName` = '"+_username +"'"); // THIS IS BAD -- but it will usually do what you are after if you need it *RIGHT NOW*
正如其他答案所述,为了安全起见,您应该使用PreparedStatement和参数化查询。您正在将文本值\u password和\u username发送到SQL中;相反,您需要在变量中传递值。我建议这样做作为参数。我的JDBC是超级生锈的,所以现在您可以将其作为“适当的代码示例”存根
this.m_statement.executeQuery("DELETE FROM `PersonnelTable` WHERE `Password` = '" + _password + "' AND `UserName` = '"+_username +"'"); // THIS IS BAD -- but it will usually do what you are after if you need it *RIGHT NOW*
正如其他答案所述,为了安全起见,您应该使用PreparedStatement和参数化查询。您可以使用PrepareStatement及其setString()方法来设置_密码和_用户名。您不应尝试直接设置_密码和_用户名。使用setString()方法时,将SQL语句中的_password和_username的变量替换为“?”,并执行setString(1,_password)和setString(2,_username),以便第一个变量是密码变量,第二个变量是username变量。可以使用PrepareStatement及其setString()方法设置_密码和_用户名。您不应尝试直接设置_密码和_用户名。使用setString()方法时,将SQL语句中的_password和_username变量替换为“?”,并执行setString(1,_password)和setString(2,_username),以便第一个变量是密码变量,第二个变量是用户名变量。您尝试过这个吗 这个.m_语句.executeQuery(“从
PersonnelTable
WHEREPassword
=”+\u Password+”和UserName
=”+\u UserName中删除”) 你试过这个吗
这个.m_语句.executeQuery(“从
PersonnelTable
WHEREPassword
=”+\u Password+”和UserName
=”+\u UserName中删除”) ??将函数参数注入查询,使Password
=MYPASSWORD成为已执行查询的一部分?将函数参数注入查询,使Password
=MYPASSWORD成为已执行查询的一部分?我非常想强调的是,b
无疑是一个选择。总是准备好的陈述是你的朋友,使用它们。另外,请使用相同的模式来选择您的第一个结果集,您真的,真的不需要获得整个表并自己循环通过它来寻找匹配!是不是mysql中的DB对象分隔符和字符串文字分隔符?@tetsujinnoni可能是,我已经很久没有使用mysql了(现在我使用JPA)。如果你确定正确的语法,请随意更正。我想强调的是,b
绝对是你的选择。总是准备好的陈述是你的朋友,使用它们。另外,请使用相同的模式来选择您的第一个结果集,您真的,真的不需要获得整个表并自己循环通过它来寻找匹配!是不是mysql中的DB对象分隔符和字符串文字分隔符?@tetsujinnoni可能是,我已经很久没有使用mysql了(现在我使用JPA)。如果您确定正确的语法,请随意更正它。