从 JSP 站点中选择条目,使用 SQL 和 JBDC 从数据库中删除条目
Posted
技术标签:
【中文标题】从 JSP 站点中选择条目,使用 SQL 和 JBDC 从数据库中删除条目【英文标题】:Select entry from JSP site, delete entry from database with SQL and JBDC 【发布时间】:2012-04-30 19:05:34 【问题描述】:我需要一些帮助来创建一个删除我的 SQL 数据库中的条目/行的方法。为此,我使用 JBDC、JSP 和 java。我已经有了一个适用于我的 JSP 站点的 add 方法。问题是我不确定是否需要创建一个对象来完成这项工作。到目前为止,这是我的代码 JSP (removeMatch.jsp):
<div class="content">
<%
String databaseId = request.getParameter("id");
String matchDate = request.getParameter("matchDate");
String matchTime = request.getParameter("matchTime");
String meetingTime = request.getParameter("meetingTime");
String series = request.getParameter("series");
String opponent = request.getParameter("opponent");
String matchLocation = request.getParameter("matchLocation");
if (matchDate != null && matchTime != null && meetingTime != null && series != null && opponent != null && matchLocation != null)
int intSeries = Integer.parseInt(series);
Match match = new Match(matchDate, matchTime, meetingTime, intSeries, opponent, matchLocation);
//cast string to long value
long longDatabaseId = Long.parseLong(databaseId);
match.setDatabaseId(longDatabaseId);
//remove the match
MatchMapper.removeMatch(match);
//Test in console, they don't print the same values that are connected to the databaseId:
System.out.println(databaseId);
System.out.println(matchDate);
System.out.println(matchTime);
System.out.println(meetingTime);
System.out.println(series);
System.out.println(opponent);
System.out.println(matchLocation);
%>
<h3>Vælg de kampe som du vil slette og dermed fjerne fra
databasen:</h3>
<form action="removeMatch.jsp" method="post">
<fieldset>
<table border="1">
<tr>
<!-- TABEL PASSER IKKE OVER ENS!!!! -->
<th></th>
<th>Dato</th>
<th>Modstander</th>
<th>Spilletid</th>
<th>Mødetid</th>
<th>Spillested</th>
<th>Serie</th>
</tr>
<%
ArrayList<Match> matches = MatchMapper.getAllMatches();
for (Match m : matches)
%>
<tr>
<td><input type="checkbox" name="id" value=<%=m.getDatabaseId()%>></td>
<td><input type="hidden" name="matchDate" value=<%=m.getDate()%>><%=m.getDate()%></td>
<td><input type="hidden" name="matchTime" value=<%=m.getMatchStart()%>><%=m.getMatchStart()%></td>
<td><input type="hidden" name="meetingTime" value=<%=m.getMeetingTime()%>><%=m.getMeetingTime()%></td>
<td><input type="hidden" name="series" value=<%=m.getSeries()%>><%=m.getSeries()%></td>
<td><input type="hidden" name="opponent" value=<%=m.getOpponent()%>><%=m.getOpponent()%></td>
<td><input type="hidden" name="matchLocation" value=<%=m.getLocation()%>><%=m.getLocation()%></td>
</tr>
<%
%>
</table>
<a href="matchTable.jsp"><input type="submit" value="Slet Kampe" /></a>
</fieldset>
</form>
</div>
想法是用户勾选他要删除的行,然后从另一个java文件中的一个方法删除数据库中的行(removeMatch()@MatchMapper.java):
public static void removeMatch(Match match)
Connection con = null;
try
con = JDBCConnectionFactory.getInstance().getNewConnection();
// creates empty string
String sql = "";
// if Match exists in database, then prepare to call
// a DELETE FROM table_name WHERE some_column=some_value statement (matchDate and opponent)
if (match.isInDatabase())
sql = "DELETE FROM matches WHERE ID = ?) "
+ "VALUES (?)";
// if Match doesn't exist in database, then prepare to make an
// return
else
System.out.println("Kamp findes ikke i databasen");
PreparedStatement prep = con.prepareStatement(sql);
prep.setLong(1, match.getDatabaseId());
// if the match already exists in database, then get the id (so it
// won't create a new id)
if (match.isInDatabase())
prep.setLong(2, match.getDatabaseId());
// execute insert/update
prep.executeUpdate();
catch (SQLException e)
e.printStackTrace();
finally
JDBCConnectionFactory.getInstance().closeConnection(con);
我可以获得正确的 databaseId,但我的测试打印到控制台会继续打印 databaseId 为“1”的行的值。可能有一种方法可以传递正确的值,但我无法弄清楚。另一个问题是 removeMatch 并没有删除匹配项,事实上,它不会对数据库进行任何更改。
【问题讨论】:
在 JSP 中使用 scriptlet 是不好的做法。您可以考虑使用 JSTL 等替代方案。 为什么不使用 MVC 模式?见en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller 我知道这被认为是不好的做法,但这是一项学校作业:/ 以后,如果你在学校作业上寻求帮助,你应该用homework
标签来标记它。
【参考方案1】:
首先,你的 DELETE sql 看起来不对:
sql = "DELETE FROM matches WHERE ID = ?) " // Why is there a closing parenthesis?
+ "VALUES (?)"; // Why are you using VALUES in a DELETE?
我会用
sql = "DELETE FROM matches WHERE ID = ? ";
这将消除对这些行的需要:
if (match.isInDatabase())
prep.setLong(2, match.getDatabaseId());
最后,为了解决您无法更改数据库的问题,我将结束您的 try
块:
con.commit();
如果您将自动提交设置为 true
,则可能不需要此操作。我不是要批评你,但看起来这是你第一次编写 JDBC 代码。如果是这种情况,我强烈建议您通过this tutorial。它为您提供了 JDBC 原理的所有基本解释。
【讨论】:
以上是关于从 JSP 站点中选择条目,使用 SQL 和 JBDC 从数据库中删除条目的主要内容,如果未能解决你的问题,请参考以下文章