Mybatis(十)对象关系映射

商品订单关系图
在这里插入图片描述
(1)一对一映射
1、需求:查询订单信息,关联查询用户信息
2、sql实现:主信息:orders,从信息:user
那么sql语句为:

SELECT 
  orders.`id`,
  orders.`user_id`,
  orders.`number`,
  user.`username`,
  user.`sex` 
FROM
  orders,
  USER 
WHERE orders.`user_id` = user.`id`

3、具体实现
resultType方式
首先创建扩展类:

public class OrdersExt extends Orders {
    // user.`username`,user.`sex`
    private String username;
    private String sex;
    //get set
}

然后在OrdersMapper.xml中:

<!-- 一对一映射之resultType -->
<select id="findOrdersAndUser" resultType="com.itheima.mybatis.po.OrdersExt">
    SELECT
    orders.`id`,
    orders.`user_id`,
    orders.`number`,
    user.`username`,
    user.`sex`
    FROM
    orders,
    USER
    WHERE orders.`user_id` = user.`id`
</select>

在接口中:

//一对一之resultType
public List<OrdersExt> findOrdersAndUser();

小结:
使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。而且映射的属性要存在与一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。

resultMap方式
使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。首先修改扩展类:

public class OrdersExt extends Orders {
    private User user;//用户信息
        //get set
}

然后在映射文件中:

<!-- OrdersAndUserRstMap -->
<resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndUserRstMap">
    <!-- 订单信息 -->
    <id column="id" property="id" />
    <result column="user_id" property="userId" />
    <result column="number" property="number" />
​
    <!-- 用户信息(一对一) -->
    <!-- association:一对一关联映射 -->
    <!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 -->
    <!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 -->
    <association property="user" javaType="com.itheima.mybatis.po.User">
        <id column="user_id" property="id" />
        <result column="username" property="username" />
        <result column="sex" property="sex" />
    </association>
</resultMap>
<!-- 一对一映射之resultMap -->
<select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">
    SELECT
    orders.`id`,
    orders.`user_id`,
    orders.`number`,
    user.`username`,
    user.`sex`
    FROM
    orders,
    USER
    WHERE orders.`user_id` = user.`id`
</select>

小结:
在一对一结果映射时,使用resultType更加简单方便,如果有特殊要求(对象嵌套对象)时,需要使用resultMap进行映射,比如:查询订单列表,然后在点击列表中的查看订单明细按钮,这个时候就需要使用resultMap进行结果映射。而resultType更适应于查询明细信息,比如,查询订单明细列表。

(2)多对多映射
多对多映射是一对多映射的特例
1、需求:查询用户信息,关联查询该用户购买的商品信息
2、Sql实现:主信息:user,从信息:items、orders、orderdetail(一个用户对应多个商品,一个商品对应多个用户;)那么sql语句:

SELECT 
  orders.`id`,
  orders.`user_id`,
  orders.`number`,
  user.`username`,
  user.`sex`,
  orderdetail.`id` detailId,
  orderdetail.`items_id`,
  orderdetail.`items_num`,
  items.`name`,
  items.`price` 
FROM
  orders,
  USER,
  orderdetail,
  items 
WHERE orders.`user_id` = user.`id` 
  AND orders.`id` = orderdetail.`orders_id` 
  AND orderdetail.`items_id` = items.`id`

3、具体实现
首先修改User类(这里没有新加扩展类),在User类中添加List orders

public class User{
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
 
    //订单信息
    private List<Orders> orders;
}

然后在Orders类中也添加List detailList

public class Orders {
    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;   
    //订单明细集合
    private List<Orderdetail> detailList;
}

然后在Orderdetail中添加Items items

public class Orderdetail {
    private Integer id;
    private Integer ordersId;
    private Integer itemsId;
    private Integer itemsNum;   
    //商品信息
    private Items items;
}

然后在映射文件中:

<!-- UserAndItemsRstMap -->
<resultMap type="com.itheima.mybatis.po.User" id="UserAndItemsRstMap">
    <!-- 用户信息 -->
    <id column="user_id" property="id" />
    <result column="username" property="username" />
    <result column="sex" property="sex" />
    <!-- 订单信息(一(用户)对多(订单)) -->
    <collection property="orders" ofType="com.itheima.mybatis.po.Orders">
        <id column="id" property="id" />
        <result column="user_id" property="userId" />
        <result column="number" property="number" />
        <!-- 订单明细信息(一对多) -->
        <collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail">
            <id column="detailId" property="id" />
            <result column="items_id" property="itemsId" />
            <result column="items_num" property="itemsNum" />
            <!-- 商品信息(一对一) -->
            <association property="items" javaType="items">
                <id column="items_id" property="id" />
                <result column="name" property="name" />
                <result column="price" property="price" />
            </association>
        </collection>
    </collection>
</resultMap>
​
<!-- 多对多 -->
<select id="findUserAndItemsRstMap" resultMap="UserAndItemsRstMap">
    SELECT
    orders.`id`,
    orders.`user_id`,
    orders.`number`,
    user.`username`,
    user.`sex`,
    orderdetail.`id` detailId,
    orderdetail.`items_id`,
    orderdetail.`items_num`,
    items.`name`,
    items.`price`
    FROM
    orders,
    USER,
    orderdetail,
    items
    WHERE orders.`user_id` = user.`id`
    AND orders.`id` =
    orderdetail.`orders_id`
    AND orderdetail.`items_id` = items.`id`
</select>

在Mapper接口中:

public List<User> findUserAndItemsRstMap();//多对多

猜你喜欢

转载自blog.csdn.net/qq_36675851/article/details/89081341