gpt4 book ai didi

java - 如何使用 Spring mvc 和 MyBatis 获取数据连接四个表

转载 作者:行者123 更新时间:2023-12-02 00:40:09 25 4
gpt4 key购买 nike

我正在使用Spring和MyBatis,在JSP中连接四个表以获取数据时遇到问题我的模型:

用户:

public class User {     
private Long user_id;
private GroupMaster group_id;
private String login_name;
private String password;
private String full_name;
private String full_name_kana;
private String email;
private String tel;
private Date birthday;
private boolean rule;
private String salt;
// getter and setter
}

详细用户:

public class DetailUserVN {
private Long detail_user_vn_id;
private User user_id;
private String code_level;
private Date start_date;
private Date end_start;
private int total;
// getter and setter
}

群主:

public class GroupMaster {  
private Long group_id;
private String group_name;
// getter and setter
}

VNMaster:

class VNMaster {
private String code_level;
private String name_level;
// getter and setter
}

UserMapper.java

@Select("SELECT users.user_id, "
+ "users.full_name, "
+ "users.birthday, "
+ "mst_group.group_name, "
+ "users.email, users.tel, "
+ "mst_vn.name_level, "
+ "tbl_detail_user_vn.end_date, "
+ "tbl_detail_user_vn.total "
+ "FROM users "
+ "INNER JOIN tbl_detail_user_vn "
+ "ON tbl_detail_user_vn.detail_user_vn_id = users.user_id "
+ "INNER JOIN mst_vn "
+ "ON mst_vn.code_level = tbl_detail_user_vn.code_level "
+ "INNER JOIN mst_group "
+ "ON mst_group.group_id = users.group_id")
public List<User> getAllUsers();

UserServiceImpl:

public List<User> getAllUsers() {
return userMapper.getAllUsers();
}

用户 Controller :

public class UserController {

@Autowired
private UserService userService;
@RequestMapping(value="/login", method=RequestMethod.POST)
public String getAllUser(ModelMap model) {
List<User> listUser = userService.getAllUsers();
model.put("listUser", listUser);
logger.info("list of renter is: " + listUser);

return "getUser";
}
}

getUser.jsp:

<div class="">                              
<c:if test="${not empty listUser}">
<table border="1" cellpadding="5">
<tr>
<th style="background-color: #e9ecef;">ID</th>
<th style="background-color: #e9ecef;">Họ tên ▲▽</th>
<th style="background-color: #e9ecef;">Ngày sinh</th>
<th style="background-color: #e9ecef;">Phòng ban</th>
<th style="background-color: #e9ecef;">Email</th>
<th style="background-color: #e9ecef;">Phone number</th>
<th style="background-color: #e9ecef;">Tring do ▲▽</th>
<th style="background-color: #e9ecef;">Ngay het han ▲▽</th>
<th style="background-color: #e9ecef;">Tong</th>
</tr>
<c:forEach items="${listUser}" var="user">
<tr>
<td>${user.user_id}</td>
<td>${user.full_name}</td>
<td>${user.birthday}</td>
<td>${user.group_id.group_name}</td>
<td>${user.email}</td>
<td>${user.tel}</td>
<td>${mst_vn.name_level}</td>
<td>${tbl_detail_user_vn.end_date}</td>
<td>${tbl_detail_user_vn.total}</td>
</tr>
</c:forEach>
</table>
</c:if>
</div>

当我构建时,似乎没有发生错误,但无法从数据库获取某些值

示例:

<td>${user.group_id.group_name}</td>
<td>${mst_vn.name_level}</td>
<td>${tbl_detail_user_vn.end_date}</td>
<td>${tbl_detail_user_vn.total}</td>

如何修复此错误并获取相关数据?

更新:

org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'user' in 'class com.you.springmybatis.model.User'

最佳答案

SQL 查询返回包含所需数据的结果集,但您尚未指定如何将此结果集映射到您使用的对象结构。

让我们考虑一下您尝试显示 user.group_id.group_name 的一个字段值(对于其他字段,情况更为复杂,请参阅下面对此的一些想法)。

组名称的数据在结果集中名称为 group_name 的字段中返回。但 mybatis 不知道应该创建这个字段和类型为 GroupMaster 的对象,并且将 group_name 中的值设置为 group_name该对象的属性。

您需要指定UserGroupMaster 实体之间关联的映射。不幸的是,当您使用连接通过单个查询选择实体和关联实体时,无法使用 mybatis 中的注释来映射此类关联。但这可以使用 xml 映射来完成。

但是在开始之前,您需要包含参与结果集连接的每个实体的唯一 ID。这意味着您需要包含group_id等。如果没有这些字段,mybatis将创建重复的实体,但您很可能只想为不同的User创建一个GroupMaster code> 实体,如果它们引用 mst_group 表中的相同记录。

您可以在 UserMapper.xml 中创建 xml 映射,该映射与 UserMapper 接口(interface)位于同一包中,如下所示:

<resultMap id="userMap" type="User">
<id property="user_id" column="user_id"/>
<result property="full_name" column="full_name"/>
<result property="birthday" column="birthday"/>
<association property="group_id" javaType="GroupMaster">
<id property="group_id" column="group_id"/>
<result property="group_name" column="group_name"/>
</association>
</resultMap>

然后你可以在映射器中引用这个resultmap:

@ResultMap("com.you.mapper.UserMapper.userMap")
@Select("SELECT users.user_id, "
+ "users.full_name, "
+ "users.birthday, "
+ "mst_group.group_name, "
+ "users.email, users.tel, "
+ "mst_vn.name_level, "
+ "tbl_detail_user_vn.end_date, "
+ "tbl_detail_user_vn.total "
+ "FROM users "
+ "INNER JOIN tbl_detail_user_vn "
+ "ON tbl_detail_user_vn.detail_user_vn_id = users.user_id "
+ "INNER JOIN mst_vn "
+ "ON mst_vn.code_level = tbl_detail_user_vn.code_level "
+ "INNER JOIN mst_group "
+ "ON mst_group.group_id = users.group_id")
public List<User> getAllUsers();

让我们详细了解关联映射的工作原理:

<resultMap id="RM" type="A">
<association property="pB" javaType="B">
<id property="id" column="b_id"/>
<result property="name" column="b_name"/>
</association>
</resultMap>

这指定对于每个结果行(表示A类型的对象),应创建一个B类型的对象及其属性idname 应分别从 b_idb_name 列中设置。

因此,上面的映射示例指定字段 group_idgroup_name 应放入 GroupMaster 类型的对象的属性中,并且该对象应分配给 User 实体的 group_id 属性。

几点说明:

  1. 您的数据结构有点不正确,即User中的group_id字段实际上存储的不是组的ID,而是实际的对象,因此应该将其重命名为
  2. 属性的通常命名约定是驼峰式标识符,即属性应为 fullName 等,而不是 full_name

将联接映射到 mst_vntbl_detail_user_vn 时存在问题,因为 User 中没有表示此关联的字段。您需要考虑您希望对象树应该如何表示您想要从数据库中获取的数据。

对于tbl_detail_user_vn,您可能需要向User添加一个字段:

private DetailUserVN detail;

然后您将能够使用与 GroupMaster 相同的方法来映射此关联。

关于java - 如何使用 Spring mvc 和 MyBatis 获取数据连接四个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57947339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com