Java 如何使用Spring mvc和MyBatis连接四个表
我使用的是Spring和MyBatis,在JSP中连接四个表以获取数据时遇到了问题 我的模型: 用户: 详细用户:Java 如何使用Spring mvc和MyBatis连接四个表,java,spring-boot,spring-mvc,mybatis,spring-mybatis,Java,Spring Boot,Spring Mvc,Mybatis,Spring Mybatis,我使用的是Spring和MyBatis,在JSP中连接四个表以获取数据时遇到了问题 我的模型: 用户: 详细用户: 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 tota
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();
SQL查询返回包含所需数据的结果集,但您尚未指定如何将此结果集映射到所使用的对象结构
让我们考虑一个字段值,您尝试显示<代码>用户.GROPGIID.GROPPENNEX/COD>(对于其他字段,情况更复杂,请参阅下面关于此的一些想法)。 在结果集中具有name
group\u name
的字段中返回组名数据。但是mybatis不知道应该为该字段和类型为GroupMaster
的对象创建,并且group\u name
中的值应该设置为该对象的group\u name
属性
您需要为User
和GroupMaster
实体之间的关联指定映射。不幸的是,当您使用联接通过单个查询选择实体和关联实体时,无法使用mybatis中的注释映射此类关联。但这可以通过使用xml映射来实现
但在开始之前,您需要包括参与结果集联接的每个实体的唯一id。这意味着您需要包括组id
等。如果没有这些字段,mybatis将创建重复的实体,但如果不同的用户
实体引用mst\u组
表中的相同记录,则您很可能只希望为它们创建一个GroupMaster
您可以在UserMapper.xml
中创建xml映射,该映射与UserMapper
界面位于同一个包中,如下所示:
<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>
然后,您将能够使用与
GroupMaster
相同的方法映射此关联。Hi@Roman Konova,我已经用您的解决方案进行了更新,但它发生了一个错误,因为我在我的问题中进行了更新。您不应该盲目使用代码。它没有经过测试,在这里只是为了证明这个想法。我已经修复了导致该问题的地图定义中的打字错误,但可能还有其他问题。我已经根据您的想法进行了更新和修改,这很好,因此在UserMapper.xml中我可以使用:对于另一个表?不,您不能这样做,因为User
中没有code\u level
属性。我已经解释了关联映射的含义以及它是如何工作的。
public List<User> getAllUsers() {
return userMapper.getAllUsers();
}
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";
}
}
<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'
<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("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>
private DetailUserVN detail;