联表查询时,如果一个实体类A中某个属性为另一个实体类B的对象b,resultType为A时,显示出来的A的属性值中,b的属性值为空。resultType为map时,返回的数据为联表查询结果中所有列(两表重复字段会被覆盖)的值。
实例
@Data
public class User {
private String uid;
private String name;
private Card card;
}
@Data
public class Card {
private String aid;
private String uid;
}
1.当UserMapper.xml中返回值为user时,测试类、数据库查询结果及显示如下:
@Test
void test01() {
List<User> users = userMapper.queryUser();
for (User user:users
) {
System.out.println(user);
}
}
<select id="queryUser" resultType="user">
select * from user left join card on user.uid = card.uid
</select>
可以看到返回的User中card属性为空
2.当UserMapper.xml中返回值为map时,测试类、数据库查询结果及显示如下:
@Test
void test02(){
List<Map<String, String>> maps = userMapper.queryUser();
for (Map<String,String> map:maps
) {
System.out.println(map);
}
}
<select id="queryUser" resultType="map">
select * from user left join card on user.uid = card.uid
</select>
可以看到数据库查询出的结果都显示出来了,但是不是以User对象的形式展示
3.如果希望以User形式展示数据,同时card里面也不为空,这时候就要用到resultMap
个人理解:resultMap实质上就是定义一种新的数据类型,在resultMap中通过对每一个属性的定义实现返回结果中的对应数据,同时返回值类型以resultMap中的type为准
@Test
void test01() {
List<User> users = userMapper.queryUser();
for (User user:users
) {
System.out.println(user);
}
}
<!-- 定义ResultMap type:主查表的类型(返回值类型也以此为准) -->
<resultMap id="userMap" type="user">
<!-- 描述主查表信息 property:实体类属性名 column:查询结果集的列名 -->
<id property="uid" column="uid"></id>
<result property="name" column="name"></result>
<!-- association:描述次查表信息(主查表中有以次查表对象为属性)
property:映射实体类的字段或属性
javaType:完整Java类名或别名 -->
<association property="card" javaType="card">
<id property="aid" column="aid"></id>
<result property="uid" column="uid"></result>
</association>
</resultMap>
<select id="queryUser" resultMap="userMap">
select * from user left join card on user.uid = card.uid
</select>