mybatis进阶(3)--一对一查询(使用resultMap)

上一个使用的是resultType来返回值,这次使用resultMap来实现:
sql分析:同上一个
使用resultMap实现的思路:
使用resultMap将查询结果的订单信息映射到orders对象中,在orders勒种添加user属性,将关联查询出来的用户信息映射到orders对象中的user属性中。
所以我们在orders中有一个user属性。

接下来就是sql了:

<!-- 查询订单关联查询用户信息,使用resultmap -->
    <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
        SELECT
        orders.*,
        USER.username,
        USER.sex,
        USER.address
        FROM
        orders,
        USER
        WHERE orders.user_id = user.id
    </select>

那这里我们是需要定义一个resultMap的:

<!-- 订单查询关联用户的resultMap
    将整个查询的结果映射到Orders中
     -->
    <resultMap type="com.ddd.mybatis.pojo.Orders" id="OrdersUserResultMap">
        <!-- 配置映射的订单信息 -->
        <!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id
            column:订单信息的唯 一标识 列
            property:订单信息的唯 一标识 列所映射到Orders中哪个属性
          -->
        <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="com.ddd.mybatis.pojo.User">
            <!-- id:关联查询用户的唯 一标识
            column:指定唯 一标识用户信息的列
            javaType:映射到user的哪个属性
             -->
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>

        </association>
    </resultMap>

接口方法:

//查询订单关联查询用户使用resultMap
    public List<Orders> findOrdersUserResultMap()throws Exception;

测试一下吧:

@Test
    public void testFindOrdersUserResultMap() throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //获取代理对象
        OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class);
        List<Orders> list=ordersMapperCustom.findOrdersUserResultMap();
        for (Orders orders : list) {
            System.out.println(orders);
        }
        sqlSession.close();
    }

注意这里的list里面试orders来接收,测试结果如下:

Preparing: SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id 
2017-07-18 15:42:18,315 [main] [com.ddd.mybatis.mapper.OrdersMapperCustom.findOrdersUserResultMap]-[DEBUG] ==> Parameters: 
2017-07-18 15:42:18,346 [main] [com.ddd.mybatis.mapper.OrdersMapperCustom.findOrdersUserResultMap]-[DEBUG] <==      Total: 5
Orders [id=1, userId=1, number=5, createtime=Wed May 04 00:00:00 CST 2016, note=订单正常, user=User [id=1, username=小明, sex=男, birthday=null, address=北京市海淀区], orderdetails=null]
Orders [id=2, userId=3, number=15, createtime=Mon Jul 04 00:00:00 CST 2016, note=订单正常2, user=User [id=3, username=huauhua, sex=女, birthday=null, address=河南郑州], orderdetails=null]
Orders [id=3, userId=13, number=25, createtime=Fri Nov 04 00:00:00 CST 2016, note=订单正常3, user=User [id=13, username=杰克, sex=男, birthday=null, address=美国纽约], orderdetails=null]
Orders [id=4, userId=4, number=53, createtime=Tue Oct 04 00:00:00 CST 2016, note=订单正常4, user=User [id=4, username=小明星, sex=男, birthday=null, address=北京市海淀区4], orderdetails=null]
Orders [id=5, userId=6, number=14, createtime=Fri Nov 04 00:00:00 CST 2016, note=订单正常5, user=User [id=6, username=大张伟, sex=男, birthday=null, address=广州佛山], orderdetails=null]

和刚才的是一样的结果

总结:
使用resultType和使用resultMap,前者更为简单,如果pojo中没有包括查询出来的列名,需要增加列名的属性,即可完成映射。如果查询结果没有特殊要求建议使用前者。
而后者需要单独定义resultMap,实现有些麻烦,如果查询结果有特殊要求建议使用前者。
这里的特殊要求是指:查询结果是必须要映射到orders的user属性中,那就必须使用resultMap,而如果是映射到一个列表中则使用resultType。
resultMap可以实现延迟加载,resultType不能实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值