使用多个mysql表并在一个html表中显示

时间:2016-07-14 17:06:36

标签: java mysql jsp html-table el

我正在尝试通过使用sql语句加入我的user2表和orders表来将订单数添加到html表的最后一列中(我创建了userID在“user”主键和userID外键中orders并在我的Servlet类中使用setAttribute以便在我的jsp文件中使用EL。这是我现在在Servlet类中的代码,

ps = conn
                .prepareStatement("select * FROM user2 WHERE lastname LIKE '%"
                        + searchReq + "%'");
        rs = ps.executeQuery();

        while (rs.next()) {
            user = new User(rs.getInt("userID"), rs.getString("username"),
                    rs.getString("password"), rs.getString("firstname"),
                    rs.getString("lastname"), rs.getString("Email"),
                    rs.getInt("age"));
            listOfUsers.add(user);

和我的jsp:

<table border="1" class="search-table">

    <tr>
        <td>ID</td>
        <td>Username</td>
        <td>Password</td>
        <td>First Name</td>
        <td>Last Name</td>
        <td>Email</td>
        <td>Age</td>
        <td>Orders</td>


    </tr>

    <c:forEach items="${requestScope.lou}" var="current">
        <tr>
            <td><c:out value="${current.id}" /></td>
            <td><c:out value="${current.username}" /></td>
            <td><c:out value="${current.password}" /></td>
            <td><c:out value="${current.firstname}" /></td>
            <td><c:out value="${current.lastname}" /></td>
            <td><c:out value="${current.email}" /></td>
            <td><c:out value="${current.age}" /></td>
            <td><c:out value="${orders}" /></td>


        </tr>
    </c:forEach>
</table>

我的订单表有userID,orderID,Shipping和item as columns,我通过每个userID使用orderID计算订单数。

我只是不确定如何获取进入html表中每一行的订单数量,因为当我在“select * FROM user2 ... etc”语句中使用子查询时,它会返回多行(因为它应该)但我不知道如何处理多行。或者有不同的方法来处理这个?

2 个答案:

答案 0 :(得分:1)

好像你需要学习SQL

要将订单计数作为查询结果的额外列,请使用子选择,例如

SELECT userID
     , username
     , password
     , firstname
     , lastname
     , Email
     , age
     , ( SELECT COUNT(*)
           FROM orders o
          WHERE o.userID = u.userID
       ) AS orders
  FROM user2 u
 WHERE lastname LIKE ?

该SQL还使用参数标记(?),并通过调用setString()的{​​{1}}来指定标记的值。

您使用字符串连接 NOT 执行此操作,除非您希望黑客使用SQL Injection窃取您的数据和/或删除您的表格。

答案 1 :(得分:0)

以防万一有人想知道我在上面收到的帮助中做了什么,(我是初学者,所以它绝对不是最好的答案或任何东西,它只适用于我想要的东西做)

ps = conn
                .prepareStatement("SELECT userID, username, password, firstname, lastname, email, age, ( SELECT COUNT(*) FROM orders o WHERE o.userID = u.userID) AS orders FROM user2 u WHERE lastname LIKE ? ");
        ps.setString(1, "%" + searchReq + "%");

        rs = ps.executeQuery();

        while (rs.next()) {
            user = new User(rs.getInt("userID"), rs.getString("username"),
                    rs.getString("password"), rs.getString("firstname"),
                    rs.getString("lastname"), rs.getString("Email"),
                    rs.getInt("age"));

            listOfUsers.add(user);

            order = rs.getInt("orders");
            user.setOrders(order);

然后接近我的doPost方法request.setAttribute("orders", order);

的结尾

在我的jsp中:

<c:forEach items="${requestScope.lou}" var="current">
        <tr>
            <td><c:out value="${current.id}" /></td>
            <td><c:out value="${current.username}" /></td>
            <td><c:out value="${current.password}" /></td>
            <td><c:out value="${current.firstname}" /></td>
            <td><c:out value="${current.lastname}" /></td>
            <td><c:out value="${current.email}" /></td>
            <td><c:out value="${current.age}" /></td>
            <td><c:out value="${current.orders}" /></td>


        </tr>
    </c:forEach>

并为User类中的订单创建了setter和getter。