一对一映射,多对多映射

一对一映射之resultType

需求:联合order表和user表,查询每个用户的订单信息和用户信息

步骤:
1 定义orders订单PO类 属性与表对应
2 由于要得到用户的订单列表,所以订单类中要有user属性
创建OrdersExt扩展类,并继承Orders类
3 在OrdersExt类中定义username属性和sex属性
4 在OrderMapp接口中
public List findOrdersAndUser();
5 OrderMapper映射文件中

一对一映射之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>

在OrdersMapper.xml中查询的user.'username’会自动映射到OrdersExt 中的username属性上

6 测试类
List list = mapper.findOrdersAndUser();

< resultMap id=“userAndOrders” type=“com.xlj.Po.OrdersPojo”>
< id column=“id” property=“id”>< /id>
< result column=“username” property=“username”>< /result>
< result column=“sex” property=“sex”>< /result>
< result column=“user_id” property=“userId”>< /result>
< result column=“number” property=“number”>< /result>

< /resultMap>

< select id=“findAllUsersAndOrders” resultMap=“userAndOrders”>
select orders.id,orders.createtime,user.username,user.sex,orders.user_id,orders.number from USER , orders WHERE user.id = orders.user_id;
< /select>

注意:
如果属性中userId名字与表中字段user_id不一样,也可以通过给查询出来的虚拟表中字段user_id起一个别名为userId,这样mybatis也会自动映射
< select id=“findAllUsersAndOrders” resultMap=“userAndOrders”>

select orders.id,user.username,user.sex,orders.user_id userId,orders.number from USER , orders WHERE user.id = orders.user_id;

< /select>

一对一映射之resultMap映射user对象
步骤:
1 在 OrdersExt类中private User user;
2 目的将订单中user信息映射到user属性上
3 OrderMapper中
//一对一之resultMap
public List findOrdersAndUserRstMap();
4 在OrderMapper.xml中

< resultMap type=“cn.lanou.mybaits.po.OrdersExt” id=“OrdersAndUserRstMap”>

< id column=“id” property=“id” />
< result column=“user_id” property=“userId” />
< result column=“number” property=“number” />
< result column=“createtime” property=“createtime” />

<!-- 用户信息(一对一) -->
<!-- association:一对一关联映射 -->
<!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 -->
<!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 -->
<association property="user" javaType="cn.lanou.mybaits.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,
orders.createtime,
user.username,
user.sex
FROM
orders,
USER
WHERE orders.user_id = user.id
< /select>

一对多映射
三张表之间的一对多映射
orders,USER,orderdetail

需求:查询所有用户的订单及订单详情

步骤
1 创建Orderdetail的Po类
2 ordersExt类中定义
private List detailList;
注意返回值是Orderdetail对象的集合,得到Orderdetail对象就得到想要的信息

3 orderMapper接口文件中
public List findOrdersAndDetailRstMap();

4 orderMapper映射文件中

< select id=“findOrdersAndDetailRstMap” resultMap=“OrdersAndDetailRstMap”>
SELECT
orders.id,
orders.user_id,
orders.number,
user.username,
user.sex,
orderdetail.id detailId,
orderdetail.items_id,
orderdetail.items_num
FROM
orders,
USER,
orderdetail
WHERE
orders.user_id = user.id
AND orders.id = orderdetail.orders_id
< /select>

其中resultMap=“OrdersAndDetailRstMap”

5 因为最终返回结果为OrdersExt对象
在OrdersExt对象中 user对象与order对象是一对一关系
而order与orderdetail是一对多关系

此处不能使用javaType 否则报错
在这里插入图片描述

且结果包含之前一对一的结果,所以可以直接使用继承来获得之前的结果关系
在这里插入图片描述

多对多映射

需求:查询该用户的订单详情,包括用户信息,订单信息,详情信息,商品信息
四张表的信息

返回值为OrdersPojo类型的情况
ordersDetail类与Items类是一对一关系
ordersDetail类中有一个Items属性
< resultMap id=“userOrdersItems” type=“com.xlj.Po.OrdersPojo” extends=“userOrdersMap”>
< collection property=“ordersDetailList” ofType=“com.xlj.Po.OrderDetail”>
< id column=“detailId” property=“id”>< /id>
< result column=“orders_id” property=“ordersId”>< /result>
< result column=“items_id” property=“itemsId”>< /result>
< result column=“items_num” property=“itemsNum”>< /result>

        <association property="items" javaType="com.xlj.Po.Items">
            <id column="id" property="id"></id>
            <result column="name" property="name"></result>
            <result column="price" property="price"></result>
            <result column="detail" property="detail"></result>
            <result column="detail" property="detail"></result>
            <result column="createTime" property="createTime"></result>
        </association>
    </collection>
</resultMap>


<select id="findUserOrdersdetailItems" resultMap="userOrdersItems">

SELECT
orders.id,
orders.user_id,
orders.number,
user.username,
user.sex,
user.id,
orderdetail.id detailId,
orderdetail.items_id,
orderdetail.items_num,
items.id,
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

继承自
< resultMap id=“userOrdersMap” type=“com.xlj.Po.OrdersPojo”>
< id column=“id” property=“id”>< /id>
< result column=“number” property=“number”>< /result>
< result column=“createtime” property=“createTime”>< /result>
< association property=“user” javaType=“com.xlj.Po.User”>
< id column=“user_id” property=“id”>< /id>
< result column=“username” property=“name”>< /result>
< result column=“sex” property=“gender”>< /result>
< /association>
< /resultMap>

包装类中

在这里插入图片描述
在这里插入图片描述

多对多查询,返回值为User类型的情况

步骤:

1 在ordersMapper接口中
public List findUserAndItemsRstMap();
注意返回的是User对象的集合,说明返回结果是从User类开始包装的
也就是获取到user对象就得到一切信息

2 在User类中
在这里插入图片描述
3 在Orders类中有如下关系
private List detailList;

4 在Orderdetail类中有如下关系
一个订单明细对应一个商品
private Items items;

5 Items类中
在这里插入图片描述

6 在ordersMapper.xml中

=多对多=

<–UserAndItemRstMap-- >

<resultMap type="com.xlj.Po.User" id="UserAndItemsRstMap">
    <!-- 用户信息: 用户和订单是一对多关系 -->
    <id column="user_id" property="id" />
    <result column="username" property="name" />
    <result column="sex" property="gender" />
    <!-- 订单信息(一对多)订单跟明细也是一对多 -->
    <collection property="ordersList" ofType="com.xlj.Po.Orders">
        <id column="id" property="id" />
        <result column="user_id" property="userId" />
        <result column="number" property="number" />
        <!-- 订单明细信息(一对多)根据订单明细id查询得到商品id只会有一个 -->
        <collection property="orderDetailList" ofType="com.xlj.Po.OrderDetail">
            <id column="detailId" property="id" />
            <result column="items_id" property="itemsId" />
            <result column="items_num" property="itemsNum" />
            <!-- 商品信息(一对一) -->
            <association property="items" javaType="com.xlj.Po.Items">
                <id column="items_id" property="id" />
                <result column="name" property="name" />
                <result column="price" property="price" />
            </association>
        </collection>
    </collection>
</resultMap>

<!-- 多对多 -->
<select id="findUserOrdersDetailItems" resultMap="UserAndItemsRstMap">
    SELECT
    orders.`id`,
    orders.`user_id`,
    orders.`number`,
    user.`username`,
    user.`sex`,
    user.`id`,
    OrderDetail.`id` detailId,
    OrderDetail.`items_id`,
    OrderDetail.`items_num`,
    items.`id`,
    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>

在这里插入图片描述

上面表中,各自的id必须要有,否则表之间无法关联映射
没有id认为你是一条
在这里插入图片描述
多对多查询优化

将多个sql操作通用的sql语句抽取出来放到sql片段中
定义查询订单表列名的SQL片段

< sql id=“select_orders”>
orders.id,
orders.user_id,
orders.number,
< /sql>
定义查询用户表列名的SQl片段

< sql id=“select_user”>
user.username,
user.sex
< /sql>
定义查询用户表列名的SQL片段

< sql id=“select_orderdetail”>
orderdetail.id detailId,
orderdetail.items_id,
orderdetail.items_num
< /sql>

猜你喜欢

转载自blog.csdn.net/weixin_43651077/article/details/84189642