Mybatis多表关联查询(一对一、一对多)

Mybatis多表关联查询(一对一、一对多)

resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。单纯地映射不同的字段和属性名,可以看我上一篇文章中的内容。

1. 使用resultMap一对一关联查询

查询订单以及该订单的用户信息:

在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。
entity类:

public class Order{
	//订单id
	private Integer id;
	//用户id
	private Integer userId
	//订单号
	private Integer number;
	//创建时间
	private Date creatTime;
	//*用户,User属性是一个引用类型,用于存储关联查询的用户信息
	private User user;
}
public class User{
	//用户id
	private Integer id;
	//用户姓名
	private String userName;
	//用户地址
	private String address;
}

配置Mapper.xml配置文件
OrderMapper.xml
先使用id和result属性,映射order类的结果集,然后在使用association映射关联对象User的结果集

<select id="queryOrderUserResultMap" resultMap="orderUserResultMap">
    SELECT
    o.id,
    o.user_id,
    o.number,
    o.create_time,
    u.username,
    u.address
    FROM
    `order` o
    LEFT JOIN `user` u ON o.userId = u.id
</select>
<resultMap id="orderUserResultMap" type="order" >
	<!-- column:主键在数据库中的列名 property:主键在pojo中的属性名-->
    <id property="id" column="id" />
    <result property="userId" column="user_id" />
    <result property="number" column="number" />
    <result property="createTime" column="create_time" />
    <!-- association :配置一对一属性 -->
    <!-- property:order里面的User属性名 -->
        <!-- javaType:映射实体类型不区分大小写 -->
    <association property="user" javaType="User">
        <!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->
        <id property="id" column="user_id" />
        <result property="user_name" column="userName" />
        <result property="address" column="address" />
    </association>
</resultMap>

2. 使用resultMap一对多关联查询

一个用户可以有多个订单,查询所有用户信息及相关订单信息:
修改entity类:

public class User{
	//用户id
	private Integer id;
	//用户姓名
	private String userName;
	//用户地址
	private String address;
	//该用户的所有订单信息
	private List<Order> orders;
}

修改UserMapper.xml配置文件
先使用id和resultMap配置映射User类的结果,然后使用一对多关系的collection标签配置Order结果

<!-- 一对多关联,查询订单同时查询该用户下的订单 -->
<select id="queryUserOrder" resultMap="userOrderResultMap">
    SELECT
    u.id,
    u.username,
    u.address,
    o.id oid,
    o.number,
    o.createtime,
    FROM
    `user` u
    LEFT JOIN `order` o ON u.id = o.user_id
</select>

<resultMap type="user" id="userOrderResultMap">
    <id property="id" column="id" />
    <result property="userName" column="user_name" />
    <result property="address" column="address" />
    <!-- 配置一对多的关系
        property:填写pojo类中集合类类属性的名称
        javaType:填写集合类型的名称 
    -->
    <collection property="orders" javaType="list" ofType="Order">
        <!-- 配置主键,是关联Order的唯一标识 -->
        <id property="id" column="oid" />
        <result property="number" column="number" />
        <result property="createTime" column="create_time" />
    </collection>
</resultMap>


版权声明:本文为HuffmanTree_J原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。