Java mySQL嵌套循环不会执行
我正在开发一个基于SOAP的Web服务,其中一部分我必须使用嵌套循环对数据库执行一些查询,问题是内部循环在放弃之前只执行一次。以下代码:Java mySQL嵌套循环不会执行,java,mysql,sql,web-services,nested-loops,Java,Mysql,Sql,Web Services,Nested Loops,我正在开发一个基于SOAP的Web服务,其中一部分我必须使用嵌套循环对数据库执行一些查询,问题是内部循环在放弃之前只执行一次。以下代码: for(int i=0; i<selec.length; i++){ for(int j=0; j<sintom.length;j++){ var[(i*sintom.length)+j] = "INSERT INTO malattia (nome, eta
for(int i=0; i<selec.length; i++){
for(int j=0; j<sintom.length;j++){
var[(i*sintom.length)+j] = "INSERT INTO malattia (nome, eta, descrizione, sesso, etnia, sintomi) "
+ "VALUES ('" + malattia + "','" + eta + "','" + descrizione + "','" + sexarra[0] + "','" + selec[i] + "','" + sintom[j] + "')";
}
}
for(int i=0;i您的用例是应该使用准备好的语句的完美例子。请在中阅读有关它们的更多信息
使用预先准备好的语句将允许
- 避免SQL注入攻击。绝不应使用字符串连接来生成SQL查询。恶意用户可能会输入某些特殊值,从而完全改变查询的含义。非恶意用户可能会输入特殊字符(例如引号)这会导致查询失败,因为它的语法不正确
- 让数据库只为正在执行的所有insert查询准备一次执行计划。实际上,查询总是相同的。只有参数会更改
因此,代码应该如下所示:
PreparedStatement ps = conn.prepareStatement("INSERT INTO malattia (nome, eta, ...) values (?, ?, ...)");
for (int i= 0; ...) {
for (int j = 0; ...) {
ps.setString(1, malattia);
ps.setString(2, eta);
...
ps.executeUpdate();
}
}
尝试使用PreparedStatement及其批处理功能,而不是简单的查询,以简化代码并防止SQL注入。尝试为每个查询创建不同的语句
对象。此外,修复SQL注入漏洞。您能详细说明一下吗?您的意思是我应该在循环中创建语句吗?我如何保护myself反对SQL注入?是的,为每个查询创建语句对象,执行查询,然后销毁对象。有关使用准备好的语句保护自己免受SQL注入攻击的详细信息,请参阅和相应的答案。非常感谢,我会在实现您的建议后回来。@cdhowie:准备好的语句的想法ement是使用不同的参数多次重用它。这是它比常规语句更有效的地方。不应该为每个查询销毁和重新创建它。不过,即使是一次性查询,也最好使用它们来避免SQL注入。
PreparedStatement ps = conn.prepareStatement("INSERT INTO malattia (nome, eta, ...) values (?, ?, ...)");
for (int i= 0; ...) {
for (int j = 0; ...) {
ps.setString(1, malattia);
ps.setString(2, eta);
...
ps.executeUpdate();
}
}