从 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 从数据库中删除条目的主要内容,如果未能解决你的问题,请参考以下文章

SQL 从一个条目中选择两列

SQL:从最近的子表条目中选择列

SQL查询从键表中选择多个条目到同一行的不同列中

攻击使用 SQL Server 数据库的 ASP 站点

高级 SQL 选择查询

Db2/sql:使用连接选择和更新最旧的条目