我正在尝试更新汽车的价格,但我只能更新数据库中的一个项目。我认为我的逻辑错了。
有人可以告诉我如何解决它。
MySQL表:
+-----------+-----------+
| car | price |
+-----------+-----------+
| Bmw | 434312 |
| Audi | 222121 |
| Mercedes | 33333 |
+-----------+-----------+
HTML代码:
<td><input TYPE="text" NAME="Bmw"></td>
<td><input TYPE="text" NAME="Audi"></td>
<td><input TYPE="text" NAME="Mercedes"></td>
Java代码:
String Bmw=(String)session.getAttribute("Bmw");
session.setAttribute("Bmw",Bmw);
Bmw=request.getParameter("Bmw");
String Audi=(String)session.getAttribute("Audi");
session.setAttribute("Audi",Audi);
Audi=request.getParameter("Audi");
String Mercedes=(String)session.getAttribute("Mercedes");
session.setAttribute("Mercedes",Mercedes);
Mercedes=request.getParameter("Mercedes");
try {
Connection conn = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
Statement st = null;
session.setAttribute("st",st);
st = conn.createStatement();
String sqlqueryCommand = "select * from item";
ResultSet results = st.executeQuery(sqlqueryCommand);
while(results.next()) {
if(request.getParameter("Bmw")!=null && results.getString("car").equals("Bmw")) {
st.executeUpdate("update item set price='"+Bmw+"' where car='"+results.getString("car")+"'");
conn.commit();
}
if(request.getParameter("Audi")!=null && results.getString("car").equals("Audi")) {
st.executeUpdate("update item set price='"+Audi+"' where car='"+results.getString("car")+"'");
conn.commit();
}
if(request.getParameter("Mercedes")!=null && results.getString("car").equals("Mercedes")) {
st.executeUpdate("update item set price='"+Mercedes+"' where car='"+results.getString("car")+"'");
conn.commit();
}
}
conn.close();
}
catch(Exception e) {
System.out.println(e);
}
答案 0 :(得分:1)
您需要选择什么?你事先知道那个结果。
这部分:
String Bmw =(String)session.getAttribute(“Bmw”); session.setAttribute( “宝马”,BMW);
没有多大意义。也许您不想从会话中检索值,而是从请求中获取值?
注意sql注入。请改用预处理语句和参数占位符。
以下是关于如何做得更短更安全的建议。它是关于jdbc如何工作的内存,untestet。
String[] types = new String[]{"Bmw", "Audi", "Mercedes"};
PreparedStatement statement = conn.prepareStatement("update item set price=:price where car=:car");
for(String type : types)
{
String parameterValue = request.getParameter(type);
if (type != null)
{
statement.setObject("price", parameterValue);
statement.setObject("car", type);
statement.executeUpdate();
}
}
statement.close();
此外,在您的catch块中,您可能希望使用e.printStackTrace()
而不是System.out.println(e);
,这在调试时会更有用。
P.S。:您确定您的汽车列项目不包含任何空格吗?在任何循环上打印results.getString("car")
。
答案 1 :(得分:1)
当您遍历结果时要小心。您在阅读时更新了表格。
由于您已拥有数据库元数据,因此您不需要选择查询。
results.getString("car").equals("Bmw")
渲染此行无用
where car='"+results.getString("car")+"'"
这两个语句应该用简单的Where语句替换:
where car='Bmw'
如果你曾经对汽车类型进行过硬编码,那就一直使用它。这允许您仅执行更新。有疑问请在con.commit()