Mybatis的关联查询(一)
一对一的关联查询
一、使用resultType进行输出映射
1. 创建一个新的PO类,由于要将查询出来的属性映射到新的PO类。所有该PO类中应该有查询出来的所有列对应的属性。
//定义新的PO类,该类继承Orders类。有了Orders的全部属性,然后再添加User的属性
public class OrdersCustom extends Orders {
private String username;// 用户名称
private String address;// 用户地址
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2. 编写mapper.xml文件
<select id="findOrderAndUserByType" resultType="OrdersCustom" >
SELECT
orders.id,
orders.user_id userId,
orders.number,
orders.createtime,
orders.note,
USER .username,
USER .address
FROM
orders,
USER
WHERE
orders.user_id = USER .id;
</select>
3. 编写mapper接口文件
public List<OrdersCustom> findOrderAndUserByType() throws Exception;
4. 测试代码
public void testFindOrderAndUserByType() throws Exception{
SqlSession session = sessionFactory.openSession();
Mapper mapper = session.getMapper(Mapper.class);
List<OrdersCustom> ordersCustomList = mapper.findOrderAndUserByType();
for (OrdersCustom ordersCustom : ordersCustomList){
System.out.println(ordersCustom);
}
}
二、使用resultMap进行输出结果的映射
1. 使用resultMap进行输出结果映射时,不在需要创建新的PO类,只需要在主查询表的PO类中新增管理查询PO类的属性即可。
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//管理查询Po的类
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
......
}
2. 创建映射的resultMap
<resultMap id="OrderAndUserResultMap" type="Orders" >
<!--
查询结果中唯一标识列的映射
column:查询出来的列名
property:po中的属性名称
-->
<id column="id" property="id"/>
<!--
查询结果中普通列的映射
column:查询出来的列名
property:po中的属性名称
-->
<result column="user_id" property="userId" />
<result column="number" property="number" />
<result column="createtime" property="createtime" />
<result column="note" property="note" />
<!--
association:该标签用来配置一对一的关系映射
配置映射的关联的用户信息
property:要映射到的po类中的属性(orders中的属性)
javaType:要映射到的那个po类(User类)
-->
<association property="user" javaType="User" >
<!--
查询结果中唯一标识列的映射
column:查询出来的列名
property:po中的属性名称
-->
<id column="user_id" property="id" />
<!--
查询结果中普通列的映射
column:查询出来的列名
property:po中的属性名称
-->
<result column="username" property="username" />
<result column="sex" property="sex" />
<result column="address" property="address" />
</association>
</resultMap>
3. 编写mapper.xml文件
<select id="findOrderAndUserByMap" resultMap="OrderAndUserResultMap" >
SELECT
orders.*,
USER .username,
USER .sex,
USER .address
FROM
orders,
USER
WHERE
orders.user_id = USER .id;
</select>
4. 编写mapper接口文件
public List<Orders> findOrderAndUserByMap() throws Exception;
5. 测试代码
public void testFindOrderAndUserByMap() throws Exception{
SqlSession session = sessionFactory.openSession();
Mapper mapper = session.getMapper(Mapper.class);
List<Orders> ordersCustomList = mapper.findOrderAndUserByMap();
for (Orders orders : ordersCustomList){
System.out.println(orders);
}
}
三 、两种查询方式的特点
- resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
- 如果没有查询结果的特殊要求建议使用resultType。
- resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
- resultMap可以实现延迟加载,resultType无法实现延迟加载