mybatis关联查询,一对一查询,一对多查询,多对多查询

**

一对一查询

**
1.一对一 resultType实现

查找某个订单id的信息,包括用户名字和地址 关联查询 一个订单只属于一个用户 一对一关系
通过id关联用户表和订单表

订单类

public class Orders {
    private Integer id;
    private Integer user_id;
    private String node; //备注
    private String number;
    private Date createtime;

订单的扩展类,继承订单类

public class OrdersExt extends Orders{

    private String username;
    private String address;

<select id="findOrderById" parameterType="int" resultType="ordersExt">
        select
           o.*,u.username,u.address
        from
           orders o , user u
        where
           o.user_id = u.id
        and
           o.id = #{id}
    </select>

2.一对一 resultMap实现
如果模型类里面包含有模型,则用resultMap
例如:orders中有user模型属性

用户模型

public class User implements Serializable {
	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址

订单模型,里面包含用户模型

public class Orders {
    private Integer id;
    private Integer user_id;
    private String node; //备注
    private String number;
    private Date createtime;

    private User user;//订单所属的用户

则:

 <!--如果模型里有模型,使用resultMap-->
    <resultMap id="orderRslMap" type="orders">
        <!-- 往orders的模型匹配数据-->
        <id column="id" property="id"></id>
        <result column="node" property="node"></result>
        <result column="number" property="number"></result>
        <result column="createtime" property="createtime"></result>
        <!-- 往orders的user匹配数据-->
        <association property="user" javaType="user">  <!--前一个user指属性,后一个user指模型-->
            <id column="user_id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
        </association>
    </resultMap>
    <select id="findOrderById2" parameterType="int" resultMap="orderRslMap">
        select
           o.*,u.username,u.address
        from
           orders o , user u
        where
           o.user_id = u.id
        and
           o.id = #{id}
    </select>

一对多查询

根据订单id查找订单信息、用户信息和订单明细信息
可通过collection来实现

public class Orders {
    private Integer id;
    private Integer user_id;
    private String node; //备注
    private String number;
    private Date createtime;

    private User user;//订单所属的用户

    //一对多数据封装  一个订单里面有多个详情
    private List<OrderDetail> orderDetails;

如果模型里面包含的是集合类的模型

扫描二维码关注公众号,回复: 9191412 查看本文章
 <resultMap id="orderRslMap3" type="orders">
        <!-- 往orders的模型匹配数据-->
        <id column="id" property="id"></id>
        <result column="node" property="node"></result>
        <result column="number" property="number"></result>
        <result column="createtime" property="createtime"></result>
        <!-- 往orders的user匹配数据-->
        <association property="user" javaType="user"> <!--前一个user指属性,后一个user指模型-->
            <id column="user_id" property="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
        </association>
        <!-- 往orders的orderdetail匹配数据-->
        <collection property="orderDetails" ofType="orderDetail">  <!--注意后一个类型选ofType:里面填的是类的类型,也不是填list-->
            <id column="detail_id" property="id"></id>
            <result column="items_id" property="itemsId"></result>
            <result column="items_num" property="itemsNum"></result>
        </collection>
    </resultMap>
    <select id="findOrderById3" parameterType="int" resultMap="orderRslMap3">
        select
           o.*,
           u.username,
           u.address,
           od.id detail_id,
           od.items_id,
           od.items_num
        from
           orders o,
           user u,
           orderdetail od
        where
           o.user_id=u.id
           and
           o.id=od.orders_id
           and
           o.id=#{id}
    </select>

多对多查询

查询用户信息及用户购买的商品信息,要求将关联信息映射到主pojo的pojo属性中

在这里插入图片描述
映射思路:
①.将用户信息映射到user中。
②.在user类中添加订单列表属性List orderslist,将用户创建的订单映射到orderslist
③在Orders中添加订单明细列表属性List detailList,将订单的明细映射到detailList
④.在Orderdetail中添加Items属性,将订单明细所对应的商品映射到Items

 <!--查询用户信息,及用户购买的商品信息  多对多查询-->
    <resultMap id="userAndOrderRslMap" type="user">
        <!--1.匹配user属性-->
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="address" property="address"></result>
        <!--2.匹配user里的orderList-->
        <collection property="ordersList" ofType="orders">
            <id column="order_id" property="id"></id>
            <result column="number" property="number"></result>
            <result column="createtime" property="createtime"></result>
            <result column="node" property="node"></result>
            <!--3.匹配orders里面有orderDetails-->
            <collection property="orderDetails" ofType="orderDetail">
                <id column="detail_id" property="id"></id>
                <id column="items_id" property="itemsId"></id>
                <result column="items_num" property="itemsNum"></result>
                <!--4.匹配orderDetail中的item-->
                <association property="items" javaType="items">
                    <id column="items_id" property="id"></id>
                    <result column="name" property="name"></result>
                    <result column="price" property="price"></result>
                    <result column="detail" property="detail"></result>
                </association>
            </collection>
        </collection>
    </resultMap>
    <select id="findUserAndOrderInfo" resultMap="userAndOrderRslMap" >
        SELECT
           u.id,
           u.username,
           u.address,
           o.id order_id,
           o.number,
           o.createtime,
           o.note,
           od.id detail_id,
           od.items_id,
           od.items_num,
           it.name,
           it.price,
           it.detail
        FROM
           user u,
           orders o,
           orderdetail od,
           items it
        WHERE
           o.user_id = u.id
           AND o.id = od.orders_id
           AND od.items_id = it.id
    </select>
</mapper>

测试类

 @Test
    public void test4(){
        OrderMapper orderMapper = session.getMapper(OrderMapper.class);
        List<User> users = orderMapper.findUserAndOrderInfo();
        for (User user:users
             ) {
            System.out.println("用户信息:"+user);
            for (Orders order:user.getOrdersList()
                 ) {
                System.out.println("订单信息:"+order);
                for (OrderDetail od: order.getOrderDetails()
                     ) {
                    System.out.println("订单详细信息:"+od);
                    System.out.println("商品信息:"+od.getItems());
                }
                System.out.println("*****************************************");
            }
        }
    }

在这里插入图片描述

发布了35 篇原创文章 · 获赞 7 · 访问量 2117

猜你喜欢

转载自blog.csdn.net/weixin_40605573/article/details/103821792