java - java - 如何根据Java Servlet中的外键在一列中显示多个值?
问题描述
嘿伙计们,我有两个 MySQL 表:
主表: 用户
和辅助表: 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";
}
}
用户道:
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;
}
}
}
用户服务小程序:
@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>
有人可以向我解释如何实现这一目标吗?
解决方案
一种方法是将 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 中循环遍历它
推荐阅读
- python-3.x - python 3中的解包语法
- html - Angular5 mat-menu 修改填充和宽度属性?
- java - 从命令行启动单个 Serenity 场景
- reactjs - react navigation v3 通过 AppContainer 设置 screenProps
- android - 使用 for 循环根据用户输入创建 GridView
- amazon-web-services - Lambda 无法访问 KMS 密钥
- r - 来自超过 2 列的数据框的成对因子/分类变量列联表
- c++ - 是否可以添加到 char 类型变量以获取字符串?
- python - 熊猫数据框中的乳胶符号
- c - C: 调用main时传入的store参数