无法使用控制器中的 prepareStatement 将多行插入表中
Failed insert multiple rows into tables using prepareStatement in controller
我的代码如下所示。我试图从 JSP 页面获取多个输入并将它们插入到控制器中的 SQL 中。但它不起作用。谁能指出我正确的方向?
String price[] = request.getParameterValues("price");
String isbn[] = request.getParameterValues("isbn");
String title[] = request.getParameterValues("title");
String authors[] = request.getParameterValues("authors");
HttpSession session = request.getSession();
int number = (Integer)session.getAttribute("number");
for(int i = 0; i<number;i++){
String queryAdd = "INSERT INTO books (price, isbn, title,authors) values" + "(?,?,?,?)";
PreparedStatement stmt = conn.prepareStatement(queryAdd);
stmt.setFloat(1, Float.valueOf(price[i]));
stmt.setString(2, isbn[i]);
stmt.setString(3, title[i]);
stmt.setString(4, authors[i]);
int result = stmt.executeUpdate(queryAdd);
out.println(result);
if(result<=0){
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Views/error.jsp");
rd.forward(request, response);
}
}
conn.close();
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Views/successful.jsp");
rd.forward(request, response);
我的 jsp 页面在这里:
<form action="addBook.htm" method="post">
<table style="border:1px solid red; border-collapse: collapse">
<tr>
<th>ISBN</th>
<th>Book Title</th>
<th>Authors</th>
<th>Price</th>
</tr>
<c:forEach var="i" begin="1" end="${sessionScope.number}" step="1">
<tr>
<td><input type="text" name="isbn"/></td>
<td><input type="text" name="title"/></td>
<td><input type="text" name="authors"/></td>
<td><input type="text" name="price"/></td>
</tr>
</c:forEach>
<tr>
<td colspan="4" style="text-align: center">
<input type="submit" name="submit" value="Add Books" />
<input type="hidden" name="action" value="addSubmit"/>
</td>
</tr>
</table>
</form>
您的 PreparedStatement
调用有问题:
String queryAdd = "INSERT INTO books (price, isbn, title,authors) values (?,?,?,?)";
PreparedStatement stmt = conn.prepareStatement(queryAdd);
stmt.setFloat(1, Float.valueOf(price[i]));
stmt.setString(2, isbn[i]);
stmt.setString(3, title[i]);
stmt.setString(4, authors[i]);
到目前为止还不错 - 但不是下一行:
int result = stmt.executeUpdate(queryAdd);
这会调用 Statement
的 executeUpdate
方法 - 传入 SQL 并忽略所有参数集。改成
int result = stmt.executeUpdate();
您可能会看到一些结果。
关于您的代码的更多注释:
- 如果您的数组中没有太多项目,您应该考虑使用 addBatch() 和 executeBatch() 减少 SQL 次往返。
- 关闭你的语句/使用 try-with-resource
我的代码如下所示。我试图从 JSP 页面获取多个输入并将它们插入到控制器中的 SQL 中。但它不起作用。谁能指出我正确的方向?
String price[] = request.getParameterValues("price");
String isbn[] = request.getParameterValues("isbn");
String title[] = request.getParameterValues("title");
String authors[] = request.getParameterValues("authors");
HttpSession session = request.getSession();
int number = (Integer)session.getAttribute("number");
for(int i = 0; i<number;i++){
String queryAdd = "INSERT INTO books (price, isbn, title,authors) values" + "(?,?,?,?)";
PreparedStatement stmt = conn.prepareStatement(queryAdd);
stmt.setFloat(1, Float.valueOf(price[i]));
stmt.setString(2, isbn[i]);
stmt.setString(3, title[i]);
stmt.setString(4, authors[i]);
int result = stmt.executeUpdate(queryAdd);
out.println(result);
if(result<=0){
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Views/error.jsp");
rd.forward(request, response);
}
}
conn.close();
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/Views/successful.jsp");
rd.forward(request, response);
我的 jsp 页面在这里:
<form action="addBook.htm" method="post">
<table style="border:1px solid red; border-collapse: collapse">
<tr>
<th>ISBN</th>
<th>Book Title</th>
<th>Authors</th>
<th>Price</th>
</tr>
<c:forEach var="i" begin="1" end="${sessionScope.number}" step="1">
<tr>
<td><input type="text" name="isbn"/></td>
<td><input type="text" name="title"/></td>
<td><input type="text" name="authors"/></td>
<td><input type="text" name="price"/></td>
</tr>
</c:forEach>
<tr>
<td colspan="4" style="text-align: center">
<input type="submit" name="submit" value="Add Books" />
<input type="hidden" name="action" value="addSubmit"/>
</td>
</tr>
</table>
</form>
您的 PreparedStatement
调用有问题:
String queryAdd = "INSERT INTO books (price, isbn, title,authors) values (?,?,?,?)";
PreparedStatement stmt = conn.prepareStatement(queryAdd);
stmt.setFloat(1, Float.valueOf(price[i]));
stmt.setString(2, isbn[i]);
stmt.setString(3, title[i]);
stmt.setString(4, authors[i]);
到目前为止还不错 - 但不是下一行:
int result = stmt.executeUpdate(queryAdd);
这会调用 Statement
的 executeUpdate
方法 - 传入 SQL 并忽略所有参数集。改成
int result = stmt.executeUpdate();
您可能会看到一些结果。
关于您的代码的更多注释:
- 如果您的数组中没有太多项目,您应该考虑使用 addBatch() 和 executeBatch() 减少 SQL 次往返。
- 关闭你的语句/使用 try-with-resource