上一个使用的是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不能实现