快上车快上车,来不及了!
一 订单商品模型
订单关系模型如下
具体的内容请看上一篇MyBatis(3)Mybaits一对一查询
二 一对多关联查询
上一篇文章,我们实现了orders表一对一关联查询user表,这里我们实现一下orders表一对多关联查询orderdetail。
(orderdetail表对应的外键orders_id是orders的主键id)
2.1需求
2.1.1 sql
SELECT
orders.*,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
FROM
orders,
orderdetail
WHERE orders.id=orderdetail.orders_id
查询结果:
2.1.2 分析
主表是orders表,并且要求映射不能出现重复记录。
我们可以在orders实体类中添加List< orderDetail > orderDetails属性。
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。
2.2实现
2.2.1 orders.java中添加list订单明细属性
public class Orders{
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//订单明细
private List<Orderdetail> orderdetails;
geter/seter...
}
2.2.2 配置文件
<resultMap type="com.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap">
<!-- 订单信息 -->
<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"/>
<!-- 关联订单明细信息
一个订单关联查询出了多条明细,要使用collection进行映射
collection:对关联查询到多条记录映射到集合对象中
property:将关联查询到多条记录映射到com.mybatis.po.Orders哪个属性
ofType:指定映射到list集合属性中pojo的类型
-->
<collection property="orderdetails" ofType="com.mybatis.po.Orderdetail">
<!-- id:订单明细唯一标识,这里在sql中命名是orderdetail_id
property:要将订单明细的唯一标识映射到com.mybatis.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>
<select id="findOrdersDetailList" resultMap="OrdersAndOrderDetailResultMap">
SELECT
orders.*,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
FROM
orders,
orderdetail
WHERE orders.id=orderdetail.orders_id
</select>
2.2.3 mapper.java
public interface UserMapper {
public List<Orders> findOrdersDetailList() throws Exception;
}
2.2.4 测试
//这里用到Juint单元测试
Public void testfindOrdersDetailList()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//查询订单信息
List<Orders> list = userMapper.findOrdersDetailList();
System.out.println(list);
//关闭session
session.close();
}
2.3拓展
实际开发中,在orders一对多orderdetail的基础上,还需要user的信息。
先来写一下对应的sql
<select id="findOrdersDetailList" resultMap="userorderdetailmap">
SELECT
orders.*,
user.username,
user.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num
FROM orders,user,orderdetail
WHERE orders.user_id = user.id
AND orders.id = orderdetail.orders_id
</select>
查询结果:
对应的resultMap(这时extends就可以大展身手了)
<resultMap type="com.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
<!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->
<!-- 这里OrdersUserResultMap对应的是上一篇一对一的id -->
<collection property="orderdetails" ofType="com.mybatis.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>