mybatis级联,一对多(1)

宽为限 紧用功 工夫到 滞塞通

今天看了mybatis级联的第二种骚操作,顿时感觉之前被坑了,就先看一下它的一对一是怎么搞的吧

    <!-- ############ 一对一 ############## -->
    <resultMap type="test.mybatis.one2many.po.Orders" id="OrdersUserResultMap">
        <!-- 配置映射的订单信息 -->
        <!-- id:查询列中的唯一标识,订单信息中的唯一标识,如果多列组成唯一标识(如:一般数据库设计中的字典表 使用联合主键),就需要配置多个id 
            column:订单信息的唯一标识 列 property:订单信息的唯一标识列所映射到orders中的那个属性(假如:数据库中orders表中的主键为orders_id,而实体属性名称为ordersId, 
            则这个配置应为<id column="orders_id" property="ordersId"/>,类似hibernate实体映射文件配置)。 -->
        <id column="id" property="id" />
        <result column="user_id" property="userid" />
        <result column="number" property="number" />
        <result column="createtime" property="createTime" />
        <result column="note" property="note" />
        <!-- 配置映射的关联用户信息 -->
        <!--association:用于映射关联查询单个对象的信息 property:要将关联查询的用户信息映射到Orders中那个属性 -->
        <association property="user" javaType="test.mybatis.one2many.po.User">
            <!-- id:关联查询用户的唯一标识 column:指定唯一标识用户信息的列 property:映射到user的那个属性 -->
            <id column="user_id" property="id" />
            <result column="username" property="username" />
            <result column="sex" property="sex" />
            <result column="address" property="address" />
        </association>
    </resultMap>

    <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
        SELECT t1.*,
        t2.username,
        t2.sex,
        t2.address
        FROM
        orders t1,
        t_user t2
        WHERE
        t1.user_id=t2.id
    </select>

再回看一下之前的那种 mybatis级联,一对一
是不是觉得这种配置非常简单粗暴这里写图片描述

OrdersCustomMapper.java 接口文件

    /**
     * 查询订单关联查询用户信息,使用reslutMap
     * @return
     */
    public List<Orders> findOrdersUserResultMap();

测试文件是这样滴

sqlSession = SqlSessionFactoryUtil.openSqlSession();
// 创建代理对象 
OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class); 
List<Orders> list2 = oc.findOrdersUserResultMap(); 
System.out.println(list2.get(0).getUser().getUsername());

当然你也可以改一下SQL改为指定id查询,这就不是一个集合了,不知道的乍一看可能还会以为是一对多啥的… 这里写图片描述

OK,接下来我们看看这次的主题 一对多,这里就直接上这种骚操作了这里写图片描述

先看OrdersCustomMapper.java 接口文件

    /**
     * 查询订单(关联用户)以及订单明细(一对多) 
     * @return
     */
    public List<OrderDetail> findOrdersAndOrderDetailResultMap();

嗯,定义一个查询方法。

接下来再看XML配置

    <!-- ################ 一对多 ###################### -->
    <select id="findOrdersAndOrderDetailResultMap" resultMap="ordersAndOrderDetailResultMap">
        SELECT
        t1.*,
        t2.username,
        t2.sex,
        t2.address,
        t3.id orderdetail_id,
        t3.items_id,
        t3.items_num,
        t3.orders_id
        FROM
        orders t1,
        t_user t2,
        orderdetail t3
        WHERE
        t1.user_id = t2.id AND t3.orders_id=t1.id
    </select>

    <resultMap type="test.mybatis.one2many.po.Orders" id="ordersAndOrderDetailResultMap"
        extends="OrdersUserResultMap">
        <!-- 订单信息 -->
        <!-- 关联用户信息 -->
        <!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->

        <!-- 关联订单明细信息 一个订单关联查询出了多条订单明细,要使用collection映射 collection:对关联查询到的多条记录映射到集合中 
            property:将关联查询到的多条记录映射到orders类的那个属性 ofType:指定映射的集合属性中pojo的类型 -->
        <collection property="orderdetails" ofType="test.mybatis.one2many.po.OrderDetail">
            <!-- id:唯一标识 property:要将订单明细的唯一标识映射到test.mybatis.one2many.po.OrderDetail的那个属性 -->
            <id column="orderdetail_id" property="id" />
            <result column="items_id" property="itemsId" />
            <result column="items_num" property="itemsNum" />
            <result column="orders_id" property="ordersId" />
        </collection>
    </resultMap>

注意:
看这个,orderdetail_id 它是在<select id="findOrdersAndOrderDetailResultMap" resultMap="ordersAndOrderDetailResultMap"> 这里定义的 t3.id orderdetail_id这是个别名,所以数据库里别翻了。这里写图片描述
还是简单介绍一下 一对多 在xml里是怎么配置的吧! 来,这里是这一句<collection property="orderdetails" ofType="test.mybatis.one2many.po.OrderDetail"> 没错,就这个collection属性,一对一的是这个属性 association 使用时别混淆了。其实也很好记,Java 中Collection这个不就是集合框架的父类。
这种级联的方式主要是通过SQL直接查询的,这里并不是通过对象直接点出来的那种。之前一对一的那种方式本人愚笨,一对多的暂时还没搞清楚。不过我还是会回来的 这里写图片描述

那再看看测试类吧

sqlSession = SqlSessionFactoryUtil.openSqlSession();
// 创建代理对象 
OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class); 
List<OrderDetail> list3 = oc.findOrdersAndOrderDetailResultMap();
System.out.println(list3);

运行效果:
这里写图片描述

站在巨人的肩膀上

本篇博客参考的文章 mybatis入门基础(六)—-高级映射(一对一,一对多,多对多)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值