java - 如何根据Java Servlet中的外键在一列中显示多个值?
Posted
技术标签:
【中文标题】java - 如何根据Java Servlet中的外键在一列中显示多个值?【英文标题】:How to display multiple values in one column depending on foreign key in Java Servlet? 【发布时间】:2021-06-20 02:11:10 【问题描述】:大家好,我有两个 mysql 表:
主表: users
和辅助表: users_phones
每个用户可以有多个电话号码 - 在第二个 SQL 表中 user_id 是指向主表用户 ID 的外键。我试图在 JSP 表中列出所有用户以及每个用户的电话号码,但我无法做到。
到目前为止,这是我想出的:
用户 POJO:
public class User
private int id;
private String username;
private String email;
private String password;
private List<String> userPhoneNumbers = new ArrayList<>();
public User()
public User(String username, String email, String password, List<String> userPhoneNumbers)
this.username = username;
this.email = email;
this.password = password;
this.userPhoneNumbers = userPhoneNumbers;
// Getters and Setters
@Override
public String toString()
return "User" +
"id=" + id +
", username='" + username + '\'' +
", email='" + email + '\'' +
", password='" + password + '\'' +
" \n";
电话号码 POJO:
public class PhoneNumbers
private int idPhone;
private String phoneNumber;
private int idUser;
public PhoneNumbers()
// Getters and Setters
@Override
public String toString()
return "UserPhone" + "idPhone=" + idPhone + ", phoneNumber='" + phoneNumber
+ ", idUser=" + idUser + '\'' + "\n";
用户DAO:
public class UserDao
private static final String FIND_ALL_USERS_QUERY =
"SELECT *"
+ " FROM users"
+ " INNER JOIN users_phone_nums"
+ " ON users.id = users_phone_nums.user_id";
public List<User> findAll()
return getUsers(-1, FIND_ALL_USERS_QUERY);
private List<User> getUsers(int id, String query)
try (Connection conn = DbUtil.getConnection())
List<User> users = new ArrayList<>();
PreparedStatement statement = conn.prepareStatement(query);
if (id != -1)
statement.setInt(1, id);
try (ResultSet resultSet = statement.executeQuery())
while (resultSet.next())
User user = new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setEmail(resultSet.getString("email"));
user.setPassword(resultSet.getString("password"));
PhoneNumbers phoneNumbers = new PhoneNumbers();
phoneNumbers.setPhoneNumber(resultSet.getString("phone_number"));
phoneNumbers.setIdUser(resultSet.getInt("user_id"));
System.out.println("############ " + phoneNumbers);
System.out.println("----->>>>> " + user);
users.add(user);
return users;
catch (SQLException e)
e.printStackTrace();
return null;
UserServlet:
@WebServlet("/user")
public class UserServlet extends HttpServlet
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
UserDao userDao = new UserDao();
request.setAttribute("users", userDao.findAll());
getServletContext().getRequestDispatcher("/web/user/listUsers.jsp").forward(request, response);
这里是 JSP:
<table id="usersTableId">
<thead>
<tr>
<th>ID</th>
<th>Username</th>
<th>Email</th>
<th>Password</th>
<th>user phone</th>
</tr>
</thead>
<tbody>
<c:forEach items="$users" var="user">
<tr>
<td>$user.id</td>
<td>$user.username</td>
<td>$user.email</td>
<td>$user.password</td>
<td>How to list user's phone numbers?</td>
</tr>
</c:forEach>
</tbody>
</table>
有人可以向我解释一下如何做到这一点吗?
【问题讨论】:
【参考方案1】:一种方法是将 User 类中 userPhoneNumbers 的类型从列表更改为字符串;并准备一个逗号分隔的电话号码字符串。
(同时建议将PhoneNumbers
pojo 重命名为PhoneNumber
。)
StringBuilder phoneNums = new StringBuilder()
PhoneNumbers phoneNumbers = new PhoneNumbers();
for(PhoneNumbers phoneNumber : phoneNumbers)
phoneNums.append(resultSet.getString("phone_number")).append(", ");
user.setPhoneNumbers(phoneNums.toString());
现在在 JSP 中,您可以打印这个逗号分隔的字符串值。
另一种选择是继续将其设置为列表并让另一个c:foreach
在 JSP 中循环遍历它
【讨论】:
是的,我想用第二种方式实现它,使用 c:foreach 循环,但是当我尝试时,我只有一个空数组,而第一种方式它不起作用我已经尝试过了 【参考方案2】:编辑:没有正确阅读问题;
<td>$custom.userid</td>
<td>$custom.username</td>
<td>$custom.email</td>
<td>$custom.password</td>
<td>
<c:forEach items="$custom.numbers" var="number">
<div class="stylethisyo">
$number
</div>
</c:forEach>
</td>
这可行,只需要循环子集吗?
编辑 2:我也可能会将我的模型分开。所以会有一个用户对象和数字对象。然后在映射它们时,我不会多次创建具有相同数据的对象,它只会是包含用户详细信息的 CustomObjects 列表和数字列表。
您可以通过查找用户来实现此目的,然后在 while 循环中使用 PreparedStatement 类查找该用户的数字并将它们添加到 CustomObject。
【讨论】:
好吧,我想通了,但在这种情况下,你遍历整个子集,我的想法是遍历一个用户的电话 - 例如用户 1 有 3 个电话号码 - 在每个用户的行上只显示他的/她的手机,而不是整个子集。 是的,Bajal 的回答向您展示了一种方法,而我的则展示了另一种方法。您需要更多地考虑如何显示数据,如果您以当前的方式连接两个表,那么每个数字的每一行都会有冗余的用户数据,但是如果您拆分查询,您可以轻松地将列表分配给用户对象。以上是关于java - 如何根据Java Servlet中的外键在一列中显示多个值?的主要内容,如果未能解决你的问题,请参考以下文章
Java-Servlet--《12-WEB应用中的普通Java程序如何读取资源文件.mp4》 有疑问
如何检查 java servlet 过滤器中的 OPTIONS 方法调用?